Dot Net的調(diào)試 - 1
2024-07-21 02:19:52
供稿:網(wǎng)友
debug是整個(gè)軟件開(kāi)發(fā)過(guò)程中最痛苦的部分之一。我們不想說(shuō)發(fā)現(xiàn)一個(gè)小bug是多么的困難-你可能已經(jīng)都知道。軟件中bug的數(shù)量是隨著軟件的復(fù)雜程度和經(jīng)常沒(méi)有及時(shí)修正bug而增長(zhǎng)的。這些bug和軟件的負(fù)責(zé)程度互相影響,使工程變得更加復(fù)雜。所以我們不斷的監(jiān)控和修改bug。
最好的辦法是執(zhí)行單元測(cè)試的時(shí)候來(lái)修正bug,當(dāng)軟件出現(xiàn)問(wèn)題的時(shí)候,軟件不會(huì)告訴我們哪里出現(xiàn)錯(cuò)誤,為什么出現(xiàn)錯(cuò)誤,我們的任務(wù)就是跟蹤進(jìn)程去解決他們。
這篇文章我們就是想告訴你怎樣利用dotnet framework來(lái)調(diào)試和跟蹤讓這個(gè)處理過(guò)程變得簡(jiǎn)單。我們將簡(jiǎn)要的告訴你怎么樣有效的使用他們,并用結(jié)合例子說(shuō)明。
跟蹤
在這篇文章中首先要討論的調(diào)試的策略是跟蹤。跟蹤是很強(qiáng)大的技術(shù),因?yàn)樗试S你看到應(yīng)用程序的整個(gè)在運(yùn)行期的整個(gè)行為,分析他是最有效的,盡管他不能提供需要的信息。
dotnet在system.diagnostics名字空間中提供了跟蹤的功能,正確的說(shuō)是trace class
trace是個(gè)靜態(tài)類(lèi)(這意味著所有的成員是靜態(tài)的,你不需要初始化他來(lái)獲得它的功能)
.產(chǎn)生一個(gè)斷言(有條件或沒(méi)有)
.根據(jù)提供的條件輸出跟蹤信息
.格式化跟蹤輸出信息
讓我們從簡(jiǎn)要的成員方法開(kāi)始研究:
public static void assert(bool)
public static void assert(bool,string)
public static void assert(bool,string,string)
assert方法顯示一個(gè)失敗信息(應(yīng)用程序失敗的時(shí)候顯示信息,允許用戶(hù)中斷執(zhí)行,忽略錯(cuò)誤或者重新運(yùn)行引起錯(cuò)誤的代碼),如果條件是false,兩個(gè)重載函數(shù)允許顯示指定的自定義一個(gè)或兩個(gè)跟著的信息。(這些信息通過(guò)string參數(shù)設(shè)置,這么做允許開(kāi)發(fā)者顯示額外的斷言失敗的信息)
//asertion demo
//
//purpose: to demonstrate results of different assert method calls
using system;
using system.diagnostics
namespace assertion
{
class application
{
[stathread]
static void main(string[] args)
{
//simple assertion. no additional message
trace.assert(false);
}
}
}
程序?qū)@示下面的消息對(duì)話(huà)框
正如你看到的,僅僅是顯示異常信息。沒(méi)有顯示任何上下文信息,所以我們不能看到失敗的原因。下面,應(yīng)用程序調(diào)用assert方法用它的一個(gè)屬性:
//asertion demo
//
//purpose: to demonstrate results of different assert method calls
using system;
using system.diagnostics
namespace assertion
{
class application
{
[stathread]
static void main(string[] args)
{
//simple assertion. no additional message
trace.assert(false,”simple assertion message”);
}
}
}
這個(gè)程序顯示了一個(gè)更多信息的對(duì)話(huà)框。可以看到我們能提供的關(guān)于失敗原因的信息。
調(diào)用有兩個(gè)信息的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 main(string[] args)
{
//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ù)正確性等情況的時(shí)候才用這種方法。下邊是他最常用的例子:public void storeobject(persistentobject obj)
{
trace.assert(obj != null, "cannot store null object");
}
這個(gè)方法檢查object對(duì)象不是null的時(shí)候被存儲(chǔ)。當(dāng)程序失敗的時(shí)候是產(chǎn)生異常的最好時(shí)間,但這不是必要條件。例如,如果這個(gè)方法保存了一些重要的程序數(shù)據(jù),斷言是完美的選擇。
備注:調(diào)試跟蹤是有用的,如果最終發(fā)行版本中包含了斷言信息對(duì)用戶(hù)來(lái)說(shuō)是無(wú)法忍受的。下面的竅門(mén)可以幫助你控制跟蹤開(kāi)關(guān)。
如果你手工編譯工程(比如命令行編譯),缺省顯示跟蹤信息。如果在c#中用跟蹤功能,當(dāng)你編譯代碼的時(shí)候,要加/d:trace標(biāo)志來(lái)編譯命令行,或者你可以簡(jiǎn)單的加入#define trace到文件最頂端。
比如,下面的小程序:
using system;
using system.diagnostics;
namespace traceshow
{
class calss1
{
///<summary>
///the main entry point for the application
///</summary>
[stathread]
static void main(string[] args)
{
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)。在這個(gè)屬性頁(yè)面對(duì)話(huà)框中,發(fā)現(xiàn)條件編譯常量(在configuration properties文件夾下,build pane中這個(gè)選項(xiàng)是鎖定狀態(tài)),去掉trace選項(xiàng)):
public static void fail(string)
public static void fail(string, string)
fail方法產(chǎn)生一個(gè)無(wú)條件斷言。它的有些行為有點(diǎn)像assert方法,但是他不需要任何處理?xiàng)l件。
帶有簡(jiǎn)單條件的失敗條件不能被選中那么用這個(gè)方法。下邊的例子是這種異常的處理情形:
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類(lèi)可以在不產(chǎn)生任何條件的情況下寫(xiě)入跟蹤信息。比如信息輸出到作為跟蹤信息的接收者的設(shè)備中。用write方法執(zhí)行輸出。
write方法可以建立作為對(duì)象或者字符串的描繪信息。以前的案例中,object.tostring被呼叫執(zhí)行。有其他三個(gè)方法可以執(zhí)行類(lèi)似的行為:writeline輸出行,writeif-條件信息,writelineif輸出一行條件信息。
write方法的第二個(gè)參數(shù)指定將要寫(xiě)入信息前的分類(lèi)(比如 一個(gè)字符串)
輸出被注冊(cè)為偵聽(tīng)器。偵聽(tīng)器是可以輸出跟蹤信息到一些設(shè)備的對(duì)象。注意assert和fail方法經(jīng)常輸出錯(cuò)誤信息到窗體或者控制臺(tái),不管那個(gè)偵聽(tīng)器被選中。這類(lèi)對(duì)象必須繼承tracelistener類(lèi),他有以下重要的方法:
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)