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