C#調試心經

作者: Alexis  來源: 博客園  發布時間: 2010-11-07 20:36  閱讀: 2668 次  推薦: 3   原文鏈接   [收藏]  
摘要:我們在做程序開發時,難免會遇到錯誤異常。如何快速地找到出錯的地方、分析錯誤的原因以及找到解決問題的方案,是許多初級程序員困擾的問題,這也正是經驗的寶貴之處。 下面我將簡單介紹在Visual Studio中調試以及一些高級的調試和常見的錯誤。

  注:如無特別說明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(忽略)即可,會發現此時i已經為50了,有興趣的朋友可以看看Assert的其他用法。

  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。

3
0
 
標簽:C# VS
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()