System.Diagnostics.Debug和System.Diagnostics.Trace

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   使用   ar   for   檔案   

在 .net 類庫中有一個 system.diagnostics 命名空間,該命名空間提供了一些與系統進程、事件記錄、和效能計數器進行互動的類庫。當中包括了兩個對開發人員而言十分有用的類——debug類和 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.debug 類和 system.diagnostics.trace 類可以協助程式員方便地進行偵錯工具並檢測程式運行情況。 

debug類的所有調用僅在程式的debug版本中有效;而trace類的調用能在release版本和debug版本中都有效。

System.Diagnostics.Debug和System.Diagnostics.Trace

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.