Tôi đang sử dụng C# và Visual Studio 2010.Có thể xuất ra từ OutputDebugString trong cửa sổ đầu ra của Visual Studio không?
Khi tôi sử dụng OutputDebugString
để ghi thông tin debug, nó sẽ hiển thị trong cửa sổ đầu ra?
Tôi có thể xem kết quả từ OutputDebugString
trong DebugView, nhưng tôi nghĩ tôi sẽ thấy nó trong cửa sổ Output của Visual Studio. Tôi đã xem trong menu Công cụ? Tùy chọn? Gỡ lỗi? Chung và đầu ra KHÔNG được chuyển hướng đến cửa sổ ngay lập tức. Tôi cũng đã xem theo Menu Tools *? Tùy chọn? Gỡ lỗi? Cửa sổ đầu ra và tất cả Cài đặt đầu ra chung được đặt thành "Bật". Cuối cùng, tôi đã sử dụng danh sách thả xuống trong cửa sổ Output để xác định rằng các thông báo Debug sẽ xuất hiện.
Nếu tôi thay đổi menu Tools *? Tùy chọn? Gỡ lỗi? chung để chuyển hướng đầu ra phía cửa sổ ngay lập tức, các OutputDebugString
thông điệp không xuất hiện trong cửa sổ ngay lập tức.
Dưới đây là toàn bộ chương trình thử nghiệm của tôi:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace OutputDebugString
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern void OutputDebugString(string message);
static void Main(string[] args)
{
Console.WriteLine("Main - Enter - Console.WriteLine");
Debug.WriteLine("Main - Enter - Debug.WriteLine");
OutputDebugString("Main - Enter - OutputDebugString");
OutputDebugString("Main - Exit - OutputDebugString");
Debug.WriteLine("Main - Exit - Debug.WriteLine");
Console.WriteLine("Main - Exit - Console.WriteLine");
}
}
}
Nếu tôi chạy trong trình gỡ lỗi, các Debug.WriteLine
đầu ra không hiển thị trong cửa sổ đầu ra, nhưng OutputDebugString
đầu ra thì không.
Nếu tôi chạy từ cửa sổ bảng điều khiển, cả hai Debug.WriteLine
và OutputDebugString
sẽ hiển thị trong DebugView.
Tại sao không phải là OutputDebugString
đầu ra bao giờ xuất hiện trong cửa sổ đầu ra?
Cuối cùng, ý định của tôi là không viết nhiều đầu ra gỡ lỗi với OutputDebugString
, thay vào đó tôi sẽ sử dụng System.Diagnostics hoặc NLog hoặc một cái gì đó tương tự. Tôi chỉ cố gắng tìm hiểu, nếu tôi cấu hình một nền tảng ghi nhật ký để ghi vào OutputDebugString
, thì đầu ra có thể nhìn thấy được từ bên trong trình gỡ lỗi hay không.
Tôi đã quay lại chương trình ban đầu của mình (không phải thử nghiệm đơn giản ở trên) sử dụng TraceSources
và TraceListeners
được định cấu hình qua tệp app.config
. Nếu tôi định cấu hình các nguồn theo dõi để ghi vào System.Diagnostics.DefaultTraceListener
(được ghi thành văn bản là OutputDebugString
), thì đầu ra nguồn theo dõi DOES chuyển đến cửa sổ gỡ lỗi. Tuy nhiên, các dòng viết trực tiếp với OutputDebugString
(chẳng hạn như trong ví dụ đơn giản của tôi) KHÔNG đi đến cửa sổ gỡ lỗi. Ngoài ra, nếu tôi sử dụng một TraceListener
khác nhau mà ghi vào OutputDebugString
(Tôi có một từ Ukadc.Diagnostics tại CodePlex), đầu ra mà KHÔNG đi đến cửa sổ gỡ lỗi.
Một lưu ý về trình theo dõi theo dõi Ukadc.Diagnostics ... Ukadc.Diagnostics chứa một số trình theo dõi cho phép định dạng đầu ra tùy chỉnh (tương tự như định dạng có sẵn trong log4net, NLog và LAB). Vì vậy, với "chỉ" một phụ thuộc vào Ukadc.Diagnostics người ta có thể sử dụng "chuẩn" đăng nhập chẩn đoán .NET, nhưng tôi có thể nhận được một số tính năng nâng cao (như định dạng đầu ra) mà không trở nên phụ thuộc vào một nền tảng lớn hơn nhiều. Trong trường hợp này, tôi có thể sử dụng Ukadc.Chẩn đoán OutputDebugStringTraceListener
để ghi đầu ra ghi nhật ký vào cửa sổ gỡ lỗi có cùng định dạng (nếu muốn hoặc một định dạng khác) vì nó sẽ được ghi vào một tệp.
Lưu ý rằng tôi đã thấy những câu hỏi này, nhưng họ đã không cung cấp một giải pháp làm việc:
Để đặt câu hỏi ngớ ngẩn, tại sao bạn không sử dụng 'Debug.Write'? (và firends) –
Cuối cùng tôi có ý định sử dụng System.Diagnostics hoặc một số nền tảng đăng nhập khác. System.Diagnostics có kiến trúc TraceSource/TraceListener cho phép đích ghi (file, console, cửa sổ gỡ lỗi, vv) được thay đổi bằng cách thay đổi tệp app.config. Nếu tôi sử dụng mã với TraceSource.TraceEvent (hoặc tương tự), thì sẽ rất tuyệt khi có thể thấy kết quả đầu ra trong cửa sổ đầu ra VS đơn giản bằng cách thay đổi TraceListener thành một trình nghe "OutputDebugString". Lưu ý rằng nếu tôi sử dụng trình theo dõi mặc định, đầu ra sẽ chuyển đến cửa sổ đầu ra. – wageoghe