最近在讀《.NET開發(fā)人員調(diào)試策略》,書倒是不錯(cuò),只是翻譯的比較差。不過(guò)里面介紹的一些調(diào)試的心得還不錯(cuò),有些收獲。
下面我就總結(jié)下本書中關(guān)于Debug和Trace的一些應(yīng)用,算作一種讀書筆記。
粗略概括下關(guān)于修改BUG的幾種方法:
通過(guò)調(diào)試器調(diào)試
顧名思義就是跟蹤源代碼進(jìn)行調(diào)試,微軟還提供了遠(yuǎn)程調(diào)試的功能。通過(guò)源代碼的方式調(diào)試,我們一般會(huì)采用以下的幾種方法:
使用Exception
使用MessageBox。
使用#if Debug .. #endif
使用斷言調(diào)試:其中有Debug.Assert和Trace.Assert兩種,Debug只在Debug模式下有效,Trace則都有效。斷言模式還有個(gè)優(yōu)點(diǎn),可以直接點(diǎn)擊按鈕重試,選擇調(diào)試器進(jìn)行調(diào)試。
當(dāng)然還有通過(guò)堆棧跟蹤或者其他的一些特殊手段等等。
.net所提供的斷言調(diào)試相當(dāng)強(qiáng)大,建議大家采用該方法。具體應(yīng)用請(qǐng)自行尋找資料。
msdn:
Debug.Assert 方法
Trace.Assert 方法
通過(guò)日志調(diào)試
想必大家肯定遇到過(guò),有些BUG在客戶那邊會(huì)出現(xiàn),但是本機(jī)就是模擬不出來(lái)。而客戶要嘛遠(yuǎn)隔萬(wàn)里,要嘛就是不允許安裝遠(yuǎn)程調(diào)試。
在這種情況下,就可以通過(guò)日志調(diào)試,也就是將一些重要的信息寫到文本中,當(dāng)出現(xiàn)問(wèn)題或者BUG可以通過(guò)查看日志文件來(lái)查找原因。
記錄日志文件,就是寫文件的操作,可以有很多種方法。
此處介紹下通過(guò).net提供的偵聽(tīng)器與開關(guān)記錄日志。
1.直接創(chuàng)建
1 static void Main(string[] args)
2 {
3 bool someBool = true;
4 Trace.Listeners.Add(new TextWriterTraceListener(@"C:\MyListener.log"));
5 Trace.AutoFlush = true;//每次寫入日志后是否都將其保存到磁盤中
6
7 Trace.WriteLine(DateTime.Now.ToString() + "--Enter function LogTest");
8 Trace.Indent(); //縮進(jìn)+1
9 Trace.WriteLine("This is indented once");
10 Trace.Indent();
11 Trace.WriteLineIf(someBool, "Only written if someBool is true");
12 Trace.Unindent(); //縮進(jìn)-1
13 Trace.Unindent();
14 Trace.WriteLine("Leave function LogTest");
15 }
日志內(nèi)容:
2012-05-30 14:11:41--Enter function LogTest This is indented once Only written if someBool is true Leave function LogTest
2.通過(guò)配置文件創(chuàng)建
App.config
1 static void Main(string[] args)
2 {
3 TraceSwitch ts = new TraceSwitch("MySwitch", "descrption");//開關(guān)
4 Trace.WriteLine(DateTime.Now.ToString() + "--Enter function LogTest");
5 Trace.Indent(); //縮進(jìn)+1
6 Trace.WriteLine("This is indented once");
7 Trace.Indent();
8 Trace.WriteLineIf(ts.TraceInfo, "MySwitch TraceInfo is true!");
9 Trace.Unindent(); //縮進(jìn)-1
10 Trace.Unindent();
11 Trace.WriteLine("Leave function LogTest");
12 }
日志內(nèi)容:
2012-05-30 14:19:43--Enter function LogTest This is indented once MySwitch TraceInfo is true! Leave function LogTest
3.windows事件日志
通過(guò)Trace或者Debug中的EventLogTraceListener即可寫入事件日志。