VS中用C#開發應用程式的除錯入門、技巧和例項(轉載)
入門篇
假設你是有著.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資訊寫到你指定的檔案中,記住,寫進出的資訊不一定是出錯的資訊,也可以是你的程式的執行的一些重要資訊,當你除錯過程中發現某個模組出了問題,但是不能決定位置,那你就可以使用這個方法,如果是一天才出一個錯誤,那你就更要使用這個方法。
例項篇
涉及到WS(WebServices)的除錯
在基於WinForm的實際開始開發中,我們往往採用WS用做資料的傳遞,我們在前臺獲取收集資料,通過WS將資料傳遞給後臺,後臺做相應的業務邏輯處理後,會持久到資料庫中。而往往我們又會在WS中寫一些相關的程式碼,如身份驗證、日誌記錄、提示資訊等,怎樣去除錯這些程式碼呢。
涉及到JavaScript的除錯
許多程式設計師為除錯JavaScript感到困惑不已,因為沒有一款很好的除錯工具。一些人喜歡使用FireBug來除錯JavaScript,確實是一個不錯的選擇,Firebug提供了許多的JavaScript資訊,是一款不錯的除錯JavaScript的工具。下面我將會介紹如何使用Visual Studio除錯JavaScript,Visual Studio中除錯JS跟除錯C#差不多,都是設定斷點,不同的是我們在檢視元素值的時候需要注意點。
涉及到Ajax的除錯
現在ajax已經十分的流行,但是隨之而來的即除錯困難,大部分初級程式設計師不知道如何有效地從前臺除錯到後臺程式碼,以至出了很多不完善的ajax應用。
下面以一個簡單的例項來介紹如何使用Visual Studio除錯JavaScript。例項是使用Ajax驗證使用者登入,如果驗證通過,則提示“登入成功”,否則提示“登入失敗”。
下面是主要的程式碼,我們使用jQuery來實現ajax,並且在後臺文件中故意出錯。
正確的使用者名稱和密碼是admin和1
除錯方法如下,在後臺入口處設定斷點,然後在前臺js中呼叫後臺的方法處設定斷點,然後按F5啟動除錯,當我們輸入使用者名稱、密碼後,點選登入後會發現,前臺斷點被觸發了。
按F5繼續除錯,有時候會跳到jQuery的原始碼中,不管他,繼續F5,會發現執行到後臺中的斷點中,如下圖
而後臺程式碼的除錯是十分簡單的。(PS:有時候無需在前臺設定斷點也可直接進入後臺的除錯,如何不行的話,在前臺html檔案或者aspx檔案中認為有可能出錯的地方設定斷點,一步步除錯)
一些除錯中出現的常見錯誤(會陸續更新):
1. 我們除錯到某一句程式碼的時候,突然莫名奇妙的跳出來了,其實是剛剛執行的這一句話有異常,我們可以使用try…catch進行異常捕獲,看看異常原因是什麼,然後做相應的處理
2. 在ADO.NET,我們會使用ds.Merge()方法進行合併記憶體表,如果有異常的話,一般有以下三種情況:
A.其中一張表中有兩行一模一樣的資料,包括主鍵
B.這兩張表的結構不一致
C.兩張表中某個欄位的型別不匹配,如欄位age在A表中式string,而在B表中確是Decimal
大家如果也有收集一些常見的錯誤,期盼能夠分享
會發現此時i已經為50了,有興趣的朋友可以看看Assert的其他用法。