1. 程式人生 > >System.Diagnostics名稱空間裡的Debug類和Trace類的用途(收藏)--使用Trace 類做程式日誌

System.Diagnostics名稱空間裡的Debug類和Trace類的用途(收藏)--使用Trace 類做程式日誌

摘要 在 .NET 類庫中有一個 System.Diagnostics 名稱空間,該名稱空間提供了一些與系統程序、事件日誌、和效能計數器進行互動的類庫。當中包括了兩個對開發人員而言十分有用的類——Debug類和Trace類。本文介紹了這兩個類的一些基本用途,旨在提高廣大開發人員的開發效率。 目錄
  • 使用Debug類來幫助除錯
  • Debug類和Trace類的區別
  • 使用Trace類來做程式日誌
  • 小結
  • 參考資料
使用Debug類來幫助除錯 除錯程式對每個程式設計師來說是家常便飯。可是我們會經常遇到一些情況讓我們頭疼,例如:
  • 當我們在開發一個介面控制元件的時候,簡單的設斷點會增加Paint事件的響應次數,而造成的環境引數改變。
  • 斷點設多了,程式常常停在正常執行的地方;這樣一來,除錯一個錯誤要花費大量時間去尋找錯誤。
這時,我們就需要利用System.Diagnostics.Debug類來幫助我們除錯。我們可以通過呼叫Debug.WriteLine(String message)函式,將我們所關心的資訊列印在Visual Studio IDE的Output視窗中。也可以利用Debug.Assert(bool condition)來讓程式停在錯誤的地方,並且顯示Call stack。 Debug類中所有函式的呼叫都不會在Release版本里有效。也就是說,我們通過這種方法所加的程式碼可以僅用於除錯;在釋出的時候無需刪任何程式碼,就可以給使用者一個沒有除錯指令的程式了。 下面的這個例子演示了這兩個函式來幫助除錯的方法: 1、 新建一個Visual Studio C# Project,採用預設的專案名。 2、 往Form1上拖一個label,並採用其預設ID。 3、 在Form1.cs中的Form1類中新增下面的函式程式碼:
private int time=0;
protected override void OnPaint(PaintEventArgs e)
{
time++;
this.label1.Text="OnPain called "+time.ToString()+" Times.";
}
protected override void OnResize(EventArgs e)
{
System.Diagnostics.Debug.Assert(this.Width>200,"Width should be larger than 200.");
System.Diagnostics.Debug.WriteLine(Size.ToString());
}
4、 編譯並執行專案的Debug版本。 5、 切換Visual Studio .NET IDE到Output視窗。 6、 切換到剛才的程式,改變主視窗的大小,您可以在IDE中看到Form1視窗的實時大小,並在Form1上看到OnPaint被呼叫的次數。當視窗的寬度小於等於200個畫素的時候,系統會彈出一個Assertion Fail的對話方塊。裡面顯示了當前程式的Call Stack。如果您在OnPaint中設定了斷點,想要除錯程式的話,那麼您會進入一個死迴圈,直到您停止除錯。

Debug類和Trace類的區別 您一定發現了在System.Diagnostics名稱空間中還有一個名為Trace的類。它的函式功能和Debug非常相似。為什麼要有這樣兩個功能類似的類呢? 原因是這樣的,Debug類裡所提供的函式僅在編譯時帶#Debug巨集引數才奏效,一旦到了Release版本中,這些函式都會被忽略。也就是說Debug類的功能僅在程式設計師開發的時候能用。而Trace則不同,它能在Release版本的程式中也被執行,這樣程式設計師就可以在Release版本的程式中新增一些Debug類提供的功能了。 使用Trace類來做程式日誌 接下來的問題就是:我們程式設計師能利用Trace類的功能做些什麼呢?我們可以用它來做程式的日誌。 1、 開啟剛剛的project。 2、 用下面的程式碼覆蓋剛才第2步的程式碼:
private void Calculate()
{
int a=1,b=1;
try
{
System.Random r = new Random();
while (true)
{
a=(int)(r.NextDouble()*10);
b=(int)(r.NextDouble()*10);
System.Diagnostics.Trace.WriteLine(System.DateTime.Now.ToString()+": "+
a.ToString()+"/"+b.ToString()+"="+(a/b).ToString());
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(System.DateTime.Now.ToString()+": "+a.ToString()+
"/"+b.ToString()+"="+" ERROR: "+ex.Message);
MessageBox.Show(ex.Message);
}
}
3、 在建構函式Form1()的最後新增下面的程式碼,將Trace的輸出重定向到app.log檔案中:
System.Diagnostics.Trace.Listeners.Clear();
System.Diagnostics.Trace.AutoFlush=true;
System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener("app.log"));
4、 拖一個按鈕到該Form上,雙擊按鈕,在button1_Click函式中新增如下程式碼:
Calculate();
Application.Exit();
5、 執行該程式的Release版本,點選新增的按鈕,程式便開始執行一位隨機數除法。由於是隨機數,可能會出現出數為0的情況,這樣程式就會丟擲Exception,這是程式會自動中止。 6、 在該程式所在的目錄裡您可以發現出現了一個新的檔案app.log,裡面記錄了各個時刻的運算紀錄,並把Exception紀錄在日誌中。 <system.diagnostics>
   <trace>
     <listeners>
       <add name="myListener" type="System.Diagnostics.TextWriterTraceListener,System" initializeData="c:\myListener.log" />
       <remove type="System.Diagnostics.DefaultTraceListener,System"/>
     </listeners>
   </trace>
</system.diagnostics>