DotNet斷言跟蹤
2009-10-18 23:39 空逸云 閱讀(351) 評論(0) 收藏 舉報這是很久之前的一篇翻譯.原文我也不知道在哪?原名翻譯<<DotNet的調(diào)試>>.不過我覺得<<DotNet斷言跟蹤>>更適合它
Debug是整個軟件開發(fā)過程中最痛苦的部分之一。我們不想說發(fā)現(xiàn)一個小bug是多么的困難-你可能已經(jīng)都知道。軟件中bug的數(shù)量是隨著軟件的復(fù)雜程度和經(jīng)常沒有及時修正bug而增長的。這些bug和軟件的負(fù)責(zé)程度互相影響,使工程變得更加復(fù)雜。所以我們不斷的監(jiān)控和修改bug。
最好的辦法是執(zhí)行單元測試的時候來修正bug,當(dāng)軟件出現(xiàn)問題的時候,軟件不會告訴我們哪里出現(xiàn)錯誤,為什么出現(xiàn)錯誤,我們的任務(wù)就是跟蹤進(jìn)程去解決他們。
這篇文章我們就是想告訴你怎樣利用DotNet FrameWork來調(diào)試和跟蹤讓這個處理過程變得簡單。我們將簡要的告訴你怎么樣有效的使用他們,并用結(jié)合例子說明。
跟蹤
在這篇文章中首先要討論的調(diào)試的策略是跟蹤。跟蹤是很強(qiáng)大的技術(shù),因?yàn)樗试S你看到應(yīng)用程序的整個在運(yùn)行期的整個行為,分析他是最有效的,盡管他不能提供需要的信息。
DotNet在System.Diagnostics名字空間中提供了跟蹤的功能,正確的說是Trace Class
Trace是個靜態(tài)類(這意味著所有的成員是靜態(tài)的,你不需要初始化他來獲得它的功能)
.產(chǎn)生一個斷言(有條件或沒有)
.根據(jù)提供的條件輸出跟蹤信息
.格式化跟蹤輸出信息
讓我們從簡要的成員方法開始研究:
public static void Assert(bool)
public static void Assert(bool,string)
public static void Assert(bool,string,string)
Assert方法顯示一個失敗信息(應(yīng)用程序失敗的時候顯示信息,允許用戶中斷執(zhí)行,忽略錯誤或者重新運(yùn)行引起錯誤的代碼),如果條件是false,兩個重載函數(shù)允許顯示指定的自定義一個或兩個跟著的信息。(這些信息通過string參數(shù)設(shè)置,這么做允許開發(fā)者顯示額外的斷言失敗的信息)
//Asertion Demo
//
//Purpose: To Demonstrate Results of Different Assert Method Calls
using System;
using System.Diagnostics
namespace Assertion
{
class Application
{
[STAThread]
static void
{
//Simple assertion. No additional message
Trace.Assert(false);
}
}
}
程序?qū)@示下面的消息對話框:
圖
正如你看到的,僅僅是顯示異常信息。沒有顯示任何上下文信息,所以我們不能看到失敗的原因。下面,應(yīng)用程序調(diào)用Assert方法用它的一個屬性:
//Asertion Demo
//
//Purpose: To Demonstrate Results of Different Assert Method Calls
using System;
using System.Diagnostics
namespace Assertion
{
class Application
{
[STAThread]
static void
{
//Simple assertion. No additional message
Trace.Assert(false,”Simple assertion Message”);
}
}
}
這個程序顯示了一個更多信息的對話框。可以看到我們能提供的關(guān)于失敗原因的信息。
調(diào)用有兩個信息的Assert方法,組成更加詳細(xì)的斷言:
//Asertion Demo
//
//Purpose: To Demonstrate Results of Different Assert Method Calls
using System;
using System.Diagnostics
namespace Assertion
{
class Application
{
[STAThread]
static void
{
//Simple assertion. No additional message
Trace.Assert(false,”Simple assertion Message”,”This message just an example.In real application you can provite detailed information here’);
}
}
}
你現(xiàn)在看到更加詳細(xì)的信息:
圖
事實(shí)上,當(dāng)檢查重要條件,比如數(shù)據(jù)正確性等情況的時候才用這種方法。下邊是他最常用的例子:public void StoreObject(PersistentObject obj)
{
Trace.Assert(obj != null, "Cannot store null object");
}
這個方法檢查object對象不是null的時候被存儲。當(dāng)程序失敗的時候是產(chǎn)生異常的最好時間,但這不是必要條件。例如,如果這個方法保存了一些重要的程序數(shù)據(jù),斷言是完美的選擇。
備注:調(diào)試跟蹤是有用的,如果最終發(fā)行版本中包含了斷言信息對用戶來說是無法忍受的。下面的竅門可以幫助你控制跟蹤開關(guān)。
如果你手工編譯工程(比如命令行編譯),缺省顯示跟蹤信息。如果在c#中用跟蹤功能,當(dāng)你編譯代碼的時候,要加/d:Trace標(biāo)志來編譯命令行,或者你可以簡單的加入#define Trace到文件最頂端。
比如,下面的小程序:
using system;
using System.Diagnostics;
namespace TraceShow
{
class calss1
{
///<summary>
///The main entry point for the application
///</summary>
[STAThread]
static void
{
Trace.Listeners.Add(new TextWriterTraceLister(Console.Out));
Trace.Write(“Hey,this is a trace message\n”, “SIMPLE MESSAGE”);
}
}
}
如果在命令行編譯,你將看不到任何信息,除非你加上/d:Trace或者加入#define Trace到文件頂部。
當(dāng)你在visual c#中編譯程序這種情形將改變,visual c#中默認(rèn)是可用的,結(jié)論是你將看到跟蹤信息。關(guān)閉調(diào)試功能,瀏覽工程屬性(可以在解決方案瀏覽器重或者view->property菜單項(xiàng)。在這個屬性頁面對話框中,發(fā)現(xiàn)條件編譯常量(在configuration properties文件夾下,build pane中這個選項(xiàng)是鎖定狀態(tài)),去掉Trace選項(xiàng)):
圖
public static void Fail(string)
public static void Fail(string, string)
Fail方法產(chǎn)生一個無條件斷言。它的有些行為有點(diǎn)像Assert方法,但是他不需要任何處理?xiàng)l件。
帶有簡單條件的失敗條件不能被選中那么用這個方法。下邊的例子是這種異常的處理情形:
try
{
throw new Exception(“Sample Exception”);
}
catch(Exception Ex)
{
Trace.Fail(“Exception caught”, Ex.Message);
}
pubic static void Write(object)
public static void Write(string)
public static void Write(object, string)
public static void Write(string,string)
Trace類可以在不產(chǎn)生任何條件的情況下寫入跟蹤信息。比如信息輸出到作為跟蹤信息的接收者的設(shè)備中。用write方法執(zhí)行輸出。
Write方法可以建立作為對象或者字符串的描繪信息。以前的案例中,object.ToString被呼叫執(zhí)行。有其他三個方法可以執(zhí)行類似的行為:writeline輸出行,writeif-條件信息,writelineif輸出一行條件信息。
Write方法的第二個參數(shù)指定將要寫入信息前的分類(比如一個字符串)
輸出被注冊為偵聽器。偵聽器是可以輸出跟蹤信息到一些設(shè)備的對象。注意Assert和Fail方法經(jīng)常輸出錯誤信息到窗體或者控制臺,不管那個偵聽器被選中。這類對象必須繼承TraceListener類,他有以下重要的方法:
public virtual void Fail(string)
public virtual void Fail(string,string)
public virtual void Flush(string)
public virtual void Write(object)
public abstract void Write(string)
public virtual void Write(object,string)
public virtual void Write(string,string)
public virtual void WriteLine(object)
public Virtual void WriteLine(string)
public virtual void writeLine(object,string)
public virtual void WriteLine(string,string)
--------------------------------------------------------------------------------------------
Fail方法不能阻止應(yīng)用程序運(yùn)行,他們僅僅輸出錯誤信息。Write和WriteLine方法寫入一個消息。他們不同之處僅僅在于后者輸出執(zhí)行后再輸出一行。最后,Flush方法刷新緩存。Flush方法對跟蹤信息輸出的設(shè)備有作用(例如,流)。你可以使用自動刷新—每個信息后都自動刷新偵聽者。可以在配置文件里面配置:
<configuration>
<stream.diagnostics>
<trace autoflush = “false” />
</stream.diagnostics>
</configuration>
正如你看到的,如果你創(chuàng)建自己的傾聽者,需要至少實(shí)現(xiàn)write(string)和writeline(string)方法(這些方法是抽象方法)。
微軟提供三種跟蹤偵聽者:DefaultTraceListener,EventLogTraceListener和TextWriteTraceLister.。第一個偵聽者有缺省的方法(如果應(yīng)用程序在命令行的環(huán)境下運(yùn)行,那么輸出信息到控制臺。如果應(yīng)用程序在調(diào)試情況下,輸出到窗口)。第二個偵聽者輸出信息到指定事件日志中(基于nt技術(shù)—winnt,2k,xp或者.net)。第三個傾聽者輸出文本到流中。
活動傾聽者列表可以在編程中設(shè)置或者在配置文件中。缺省包括DefaultTraceListener.
編程改變活動傾聽者列表,要管理傾聽者集合(通過添加和刪除方法)。配置文件中管理傾聽者,你要用下邊的語法:
<configuration>
<system.diagnostics>
<trace autoflust=”false” indentsize = 4>
<listeners>
<add name=”myListener” type=”System.Dianostics.TextWriterTraceListener, system”
initializeData = “c:\MyListener.log”/>
<remove type = “System.Diagnostics.DefaultTraceListener,System”/>
</listeners>
</trace>
</system.dianostics>
</configuration>
InitializeDat參數(shù)是傳遞到構(gòu)造器的的字符串參數(shù)(指定EventLogTraceListener偵聽者事件日志)。
偵聽者很熟悉創(chuàng)建應(yīng)用程序使用偵聽者輸出跟蹤信息。代碼很簡單:
//Trace listeners demo
//
//purpose:To demonstrate how to use listeners
using System;
using System.Diagnostics;
namespace Assertion
{
class Application
{
[STAThread]
static void
{
Trace.WriteLine(“Calling WriteLine method”, “Trace Listeners demo”);
Trace.Flush();
}
}
}
這些代碼還不夠,我們必須創(chuàng)建一個配置文件來設(shè)置偵聽者:
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<remove type="System.Diagnostics.DefaultTraceListener"/>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener"
initializeData="myListener.log" />
<add name="myListenerEventLog" type="System.Diagnostics.EventLogTraceListener"
initializeData="Application" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
這個配置文件刪除了缺省偵聽者加入兩個自定義偵聽者:第一個輸出信息到文本文件,第二個輸出到事件日志中。對于第一個偵聽者initializeData屬性指定輸出數(shù)據(jù)的文件,第二偵聽者記錄事件到事件日志。
運(yùn)行程序。檢查第一個偵聽者,可以看到myListener.log文件,它包含以下信息:Tracing listeners Demo:Calling WriteLine Method
PS:事實(shí)上.很多圖片的鏈接都失效了.原作者也找不到了.我也不補(bǔ)上圖片了.這篇文章應(yīng)該很容易看懂.例子也很簡單.可以參考MSDN上有關(guān)這方面的資料跟蹤偵聽器
出處:http://kongyiyun.cnblogs.com
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
浙公網(wǎng)安備 33010602011771號