2010-06-14 46 views
16

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.WriteLineOutputDebugString 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 TraceSourcesTraceListeners đượ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:

Herehere

+1

Để đặt câu hỏi ngớ ngẩn, tại sao bạn không sử dụng 'Debug.Write'? (và firends) –

+1

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

Trả lời

31

Bạn đã cho tôi hỏi câu hỏi này một lúc. Không đời nào! Đường.

Dự án> Thuộc tính> tab Gỡ lỗi, bật hộp kiểm "Bật gỡ lỗi mã không được quản lý". Đổi tên thành "Bật gỡ lỗi mã gốc" trong các phiên bản VS sau. Với công cụ gỡ lỗi mã không được quản lý được kích hoạt, đầu ra OutputDebugString() bây giờ được chặn đúng và hướng đến cửa sổ Output.

+1

Đó là chính xác! Tôi đã thay đổi cài đặt đó trong chương trình mẫu của mình và sau đó quay trở lại chương trình ban đầu và nó đã được sửa ở cả hai nơi. Chấp nhận câu trả lời này vì câu trả lời đúng! – wageoghe

+2

+1. Chúng tôi đang sử dụng một DLL bản địa đặt thông điệp qua OutputDebugString và không thể nhìn thấy chúng. –

+0

Tùy chọn này không có sẵn cho tôi, họ có di chuyển nó không? – Zammbi

3

Nó có thể được hiển thị trong "Ngay lập tức cửa sổ" thay vì do một thiết lập:

  • Chuyển đến Công cụ/Tùy chọn/Gỡ lỗi/Chung. Bỏ chọn "Chuyển hướng tất cả văn bản cửa sổ đầu ra đến cửa sổ ngay lập tức"

Hoặc đôi khi như thế.

+0

Cảm ơn. Tôi nhìn và tùy chọn đó không được chọn. Nếu tôi kiểm tra nó, đầu ra của tôi cũng không xuất hiện trong cửa sổ ngay lập tức. – wageoghe

8

Khi gỡ lỗi (Debug => Bắt đầu gỡ lỗi F5), thiết lập Dự án + Thuộc tính, tab Gỡ lỗi, chọn "Bật gỡ lỗi mã không được quản lý" hoạt động tốt.

Khi không gỡ lỗi (Debug => Bắt đầu không gỡ lỗi CTRL + F5), bạn mujst sử dụng DebugView từ thư viện SysInternals. Download DebugView for Windows v4.76

Các vấn đề liên quan