C#調試心經

來源:互聯網
上載者:User

    我們在做程式開發時,難免會遇到錯誤異常。如何快速地找到出錯的地方、分析錯誤的原因以及找到問題的解決方案,是許多初級程式員困擾的問題,這也正是經驗的寶貴之處。下面我將簡單介紹在Visual Studio中調試以及一些進階的調試和常見的錯誤。

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(忽略)即可,

會發現此時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

大家如果也有收集一些常見的錯誤,期盼能夠分享

  

最後,Google is always the best teacher and error solver

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.