在 .NET 程序中啟用調(diào)試信息輸出我們在開發(fā)當(dāng)中,有時需要添加一些調(diào)試信息,以便在脫離集成調(diào)試環(huán)境時捕捉錯誤。Win32 編程常用 OutputDebugString 這個函數(shù)配合 DebugView 等工具來在程序中插入調(diào)試信息。為了將調(diào)試信息寫入日志,也有很多方法和第三方工具,比如著名的 log4cxx。 .Net 平臺下,我們只需要簡單的調(diào)用 Trace 和 Debug 這兩個類,即可實現(xiàn)大部分調(diào)試輸出。 一、Trace 和 Debug 的異同。 Trace 與 Debug 類均位于 System.Diagnostics. 我們在使用時,只需要引入該 namespace,同時在任何需要的地方直接調(diào)用即可。最大的區(qū)別在于,Debug 類僅在 Debug 模式下編譯有效,而 Trace 類在 Debug 和 Release 模式下均可工作。例如這段代碼:
默認(rèn)情況下,在 Debug 模式下編譯,以上 A,B 兩個均輸出到調(diào)試環(huán)境中,比如,如果開啟了DebugView,就可以看到類似如下的輸出: Debug: Parameter is null! 如果在 Release 模式下編譯代碼并運行,使用 DebugView 觀察,兩個輸出均無。這是因為,默認(rèn)情況下,編譯器為 Debug 模式添加了 “DEBUG” 和 “TRACE” 兩個條件,而 Relase 模式僅有 “TRACE” 條件。這是默認(rèn)設(shè)置,可以手工修改,修改位置在 Project->Properties->Build。如下圖所示: 既然 Trace 在 Release 模式也可以工作,為什么我們不能在 DebugView 中看到輸出呢?這是因為,我們沒有設(shè)置正確的 Listener。Debug 類默認(rèn)輸出至調(diào)試器。而 Trace 類僅在開啟 DEBUG 參數(shù)模式下輸出至調(diào)試器。我們可以自行制定 Trace 信息的輸出,通過添加 Listener。 二、Listener Listerner,又稱為監(jiān)聽器。打開 .NET 中 Debug 和 Trace 類的定義,可以看到他們都有一個集合屬性 Listeners:
這個屬性用于注冊監(jiān)聽器。實際上,無論 Debug 還是 Trace,都有一個默認(rèn)的監(jiān)聽器。對于 Trace 來說,這個監(jiān)聽器是 Console,如果沒有在程序中創(chuàng)建 Console 窗口,它的輸出就是當(dāng)你按下 F5 時,IDE 的 output 窗口。這在 Release 條件下仍然有效。 但是,我們要解決的,是脫離 IDE 環(huán)境時的調(diào)試信息輸出,這就需要手工指定 Lisenter。 .Net 內(nèi)置若干 Listener,常用的包括 ConsoleTraceListener,ConsoleTraceListener,XmlWriterTraceListener 等,使用方法很簡單。比如我們想將 Trace 信息寫入一個文本文件 MyApp.log,只要打開 app.config,加入以下代碼行:
重新編譯并運行程序,在exe文件所在的目錄下,會自動生成一個 MyApp.log 文件,里面就是想要的內(nèi)容。 以上代碼也可以在程序源代碼中調(diào)用 Trace/Debug 類的成員函數(shù)來實現(xiàn)。但是為了保持源代碼在不同配置下的一致性,便于我們隨時取消 Trace 信息(比如產(chǎn)品發(fā)布),建議將這個工作放在 App.config 進行。 我們還可以通過實現(xiàn) TraceListener 來定義自己的 Listener,這不在本文的討論范圍,有興趣的同學(xué)可自行查閱 MSDN。 三、參考資料: 1. MSDN 中的 Trace 類; |
|