PS:如無特別說明Visual Studio均指Dev10即Visual Studio 2010。
入門篇
假設你是有著.Net平台的程序員,並且使用Visual Studio 做為開發工具。
斷點:最簡單的一種,設置一個斷點,程序執行到那一句就自動中斷進入調試狀態。設置斷點,在你覺得有問題的代碼行,左側單擊,會出現紅色的紅點即斷點。
啟動調式:按F5,或者菜單欄---調式---開始調試,或者工具欄的圖標
快速監視:快速查看變量或者表達式的值,也可以自定義表達式進行計算
單步執行
有三種,一種是每次執行一行(F10);一種是每次執行一行,但遇到函數調用就會跳到被調用的函數裡(F11);一種是直接執行當前函數裡剩下的指令,返回上一級函數(Shift+F11)。
還有一種後悔藥,設為下一句(Set Next Statement),即下一句會被執行的語句(右擊設置或者快捷鍵:Ctrl+Shift+F10),但要注意在調試與數據有關的時候,設置下一句有可能會報異常。如在調試向DataTable中添加行的時候,已經存在的行不能重復被添加到DataTable中。
監視
調試器可能會自動列出一些相關變量的值,但是你可能還關心其它變量的值,可以添加對這些變量的監視。還可以監視一個表達式的值,比如a+b。但是,這個表達式最好不要修改變量的值,比如監視a++都會導致監視時修改了a的值,影響了程序的運行結果。
調試技巧篇
使用快捷鍵會大大提升我們的調試效率,常用的調試快捷鍵:
F5 啟動調試
F10 執行下一行代碼,但不執行任何函數調用。
F11 在執行進入函數調用後,逐條語句執行代碼。
Shift + F11 執行當前執行點所處函數的剩余行。
Shift + F5 停止運行程序中的當前應用程序。可用於“中斷”模式和“運行”模式。
拖動斷點(感謝 聖殿騎士的提醒)
在調試中,我們可以拖動斷點,使得程序運行到我們想要運行的地方。通常是用來驗證這段代碼對程序的運行結果有沒有影響的。因為我們拖動代碼,則被過濾的代碼就不會執行,將它跟原來的相比,可以看出去掉這段代碼有什麼影響
條件中斷
假如你寫了個for循環,而且循環的次數比較多,如下代碼,現在我們知道在i=50的時候會有異常,那我們不可能按50次F5去調試這代碼,不然這效率….
- private void ConditionDebug()
- {
- for (int i = 0; i < 100; i++)
- {
- if (i==50)
- {
- //some error code here
- Console.WriteLine("i=50 here");
- }
- }
- }
我們可以直接利用vs提供的功能修改變量i的值,一開i=0,即剛進入for循環中,我們設置將i改為49並回車,再調試一次,會發現i=50; 如下圖
當然我們也可以直接在代碼裡寫代碼以達到這個目的,代碼如下
- private void ConditionDebug()
- {
- for (int i = 0; i < 100; i++)
- {
- System.Diagnostics.Debug.Assert(i != 50);
- if (i==50)
- {
- //some error code here
- Console.WriteLine("i=50 here");
- }
- }
- }
使用了調試中的Assert(斷言),當執行程序後會彈出如下的提示框,點擊Ingore(忽略)即可,
Immediate Window
Immediate window在調試的時候計算表達式的值、執行語句、打印變量的值等。我們輸入命令(注意一定要以“>”開頭),會有智能提示,而且命名都是自解釋型。
如,我們現在想要知道i的值,可以輸入命名>Debug.Print i(也可以簡單的使用>? i),如下圖
Immediate window還有更強大的用法,計算方法的返回值(如果有的話)
如果有這個的函數
- int MethodValue(int a)
- {
- if (a==1)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
我們可以使用Immediate命令 >? class.Method(args) 去調用這個方法,如下圖
其中p是當前類的實例(因為MethodValue是類的方法,注意?和表達式之間要有空格)
對於一些實時性很高的程序(如socket)使用 Debug.Write()把錯誤寫到日志文件中,.Net可以將Debug信息寫到你指定的文件中,記住,寫進出的信息不一定是出錯的信息,也可以是你的程序的運行的一些重要信息,當你調試過程中發現某個模塊出了問題,但是不能決定位置,那你就可以使用這個方法,如果是一天才出一個錯誤,那你就更要使用這個方法。