不知道能不能算是技巧啦,寫出來放到首頁貽笑大方而已。
函數(shù)斷點
在前面的文章Visual Studio調(diào)試之避免單步跟蹤調(diào)試模式里面我講了如何設(shè)置函數(shù)斷點,說實話,我個人喜歡設(shè)置函數(shù)斷點,而不是在代碼行里面設(shè)置斷點。一般來說,函數(shù)斷點在下面幾種情形下有用:
- 例如調(diào)試一個網(wǎng)站程序,你通過分析網(wǎng)站的日志發(fā)現(xiàn)最有可能發(fā)生錯誤的函數(shù),打開調(diào)試器并將調(diào)試器附加到程序上去,設(shè)置函數(shù)斷點,重新執(zhí)行網(wǎng)站……這樣做的好處是,不用到處打開源文件去找出錯的源代碼行,調(diào)試器會自動打開源代碼,并且在函數(shù)的入口處中斷(豈不是很方便?)。
- 例如你在閱讀源代碼的時候,通常在讀到虛函數(shù)調(diào)用的時候,因為通常這種調(diào)用都是通過基類指針調(diào)用的,而你又一時半會不知道到底有哪個繼承類的Overloading函數(shù)會被調(diào)用到,函數(shù)斷點可以告訴你。
- 或者一種特殊的情形,你想讀一個程序的源代碼,但就是找不到入口Main函數(shù),例如.NET程序,那么直接在Visual Studio里面按F11就能幫你找到入口函數(shù)—這是函數(shù)斷點的一個特殊情形。
- 比如你在調(diào)試Web Service函數(shù),設(shè)置函數(shù)斷點也是一個快捷的調(diào)試方法,這個技巧跟技巧1類似。
當(dāng)然,可能有些讀者沒有辦法成功設(shè)置函數(shù)斷點,如果設(shè)置函數(shù)斷點失敗,請閱讀我的文章“不能設(shè)置斷點的檢查步驟”。如果里面有一些名詞術(shù)語(術(shù)語請參看文章:調(diào)試術(shù)語)不知道或者不知道如何設(shè)置的話,呃,我會另寫一篇文章講解。
斷點編程
有的時候你可能會碰到這種情況,觸發(fā)一個斷點以后,你發(fā)現(xiàn)需要修改一些值,才能使程序繼續(xù)正確執(zhí)行下去。例如我以前在中文版本的操作系統(tǒng)上,使用sscli里面(調(diào)試版)的csc.exe編譯器編譯一些包含語法錯誤或者語法警告的C#源文件的時候,csc.exe總是會莫名其妙地報告內(nèi)部嚴(yán)重錯誤,然后就崩潰了。我將調(diào)試器附加上去以后,發(fā)現(xiàn)是一個ASSERT錯誤,ASSERT(lcid == 0x409),表示sscli里面的csc.exe總是默認(rèn)自己在英文操作系統(tǒng)(或者說英文環(huán)境)里面運行。而且這一條語句會被執(zhí)行很多次,手工修改lcid的值的確有點麻煩。然后我找源代碼找來找去都沒有找到csc.exe在哪個地方獲取到這個lcid值(當(dāng)然我最后找到了,下一個技巧將告訴你我是怎么找到的),然而我又不想重啟系統(tǒng)(呃……也許我就是那種寧愿花1個鐘頭去找節(jié)省花費5分鐘重啟系統(tǒng)的方法的那種人……)。
這個時候如果調(diào)試器可以自動幫你重置lcid的值該有多好?幸運的是,Visual Studio提供了方法讓你完成這樣的工作。下面是一個簡化的代碼,因為我一時半會找不到sscli了:
int lcid = System.Globalization.CultureInfo.CurrentUICulture.LCID; Console.WriteLine("lcid = {0}", lcid);
上面的代碼在正常情況下,應(yīng)該返回當(dāng)前操作系統(tǒng)語言的lcid值,例如英文就是1033,中文的,呃……我忘記了。假設(shè)我們現(xiàn)在希望做的是,每當(dāng)lcid的值為1033的時候,就自動更正為0。我們需要:
1、在Console.WriteLine這一行上設(shè)置一個條件斷點,條件斷點的設(shè)置請參看Visual Studio調(diào)試之?dāng)帱c進(jìn)階篇:
2、點擊Visual Studio菜單欄里面的“工具(Tools)”—“宏(Macro)”—“宏資源管理器(Macro Explorer)”。然后創(chuàng)建一個新的宏:
Imports System Imports EnvDTE Imports EnvDTE80 Imports EnvDTE90 Imports System.Diagnostics Imports Microsoft.VisualBasic Imports Microsoft.VisualBasic.ControlChars
Public Module Module1 Sub ChangeExpression() DTE.Debugger.ExecuteStatement("lcid = 0;") End Sub End Module
上面DTE.Debugger.ExecuteStatement的作用,你可以理解成在立即窗口中執(zhí)行lcid = 0;這條語句。
3、右鍵點擊剛才設(shè)置好的斷點,在菜單里面選擇“When Hit …”,這一次在“When Breakpoint is Hit”窗口中勾選“Run a macro:(執(zhí)行一個宏)”,然后在下拉框里面選擇剛才你創(chuàng)建的宏的名稱。如果你是第一次創(chuàng)建宏,名稱應(yīng)該是:Macros.MyMacros.Module1.ChangeExpression。
4、勾選“繼續(xù)執(zhí)行(Continue execution)”,因為我們并不想讓程序中斷下來。
5、點擊確定以后,執(zhí)行程序看一看結(jié)果,lcid是不是已經(jīng)被自動改成0了?
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁 下一頁 Visual Studio調(diào)試中的斷點技巧 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|