C#調試心經(1)(轉)

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

 

PS:如無特別說明Visual Studio均指Dev10Visual Studio 2010前端

 

入門篇程序員

假設你是有着.Net平臺的程序員,而且使用Visual Studio 作爲開發工具。ajax

斷點:最簡單的一種,設置一個斷點,程序執行到那一句就自動中斷進入調試狀態。設置斷點,在你以爲有問題的代碼行,左側單擊,會出現紅色的紅點即斷點。數據庫

 

 

 

啓動調式:按F5,或者菜單欄---調式---開始調試,或者工具欄的圖標socket

快速監視:快速查看變量或者表達式的值,也能夠自定義表達式進行計算函數

  

單步執行工具

有三種,一種是每次執行一行(F10);一種是每次執行一行,但遇到函數調用就會跳到被調用的函數裏(F11);一種是直接執行當前函數裏剩下的指令,返回上一級函數(Shift+F11)。開發工具

還有一種後悔藥,設爲下一句(Set Next Statement),即下一句會被執行的語句(右擊設置或者快捷鍵:Ctrl+Shift+F10),但要注意在調試與數據有關的時候,設置下一句有可能會報異常。如在調試向DataTable中添加行的時候,已經存在的行不能重複被添加到DataTableui

監視

調試器可能會自動列出一些相關變量的值,可是你可能還關心其它變量的值,能夠添加對這些變量的監視。還能夠監視一個表達式的值,好比a+b。可是,這個表達式最好不要修改變量的值,好比監視a++都會致使監視時修改了a的值,影響了程序的運行結果。

調試技巧篇

使用快捷鍵會大大提高咱們的調試效率,經常使用的調試快捷鍵:

F5 啓動調試

F10 執行下一行代碼,但不執行任何函數調用。

F11 在執行進入函數調用後,逐條語句執行代碼。

Shift + F11 執行當前執行點所處函數的剩餘行。

Shift + F5 中止運行程序中的當前應用程序。可用於「中斷」模式和「運行」模式。

拖動斷點(感謝 聖殿騎士的提醒)

在調試中,咱們能夠拖動斷點,使得程序運行到咱們想要運行的地方。一般是用來驗證這段代碼對程序的運行結果有沒有影響的。由於咱們拖動代碼,則被過濾的代碼就不會執行,將它跟原來的相比,能夠看出去掉這段代碼有什麼影響 

條件中斷

假如你寫了個for循環,並且循環的次數比較多,以下代碼,如今咱們知道在i=50的時候會有異常,那咱們不可能按50F5去調試這代碼,否則這效率….

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信息寫到你指定的文件中,記住,寫進出的信息不必定是出錯的信息,也能夠是你的程序的運行的一些重要信息,當你調試過程當中發現某個模塊出了問題,可是不能決定位置,那你就可使用這個方法,若是是一天才出一個錯誤,那你就更要使用這個方法。

實例篇

涉及到WSWebServices)的調試

在基於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,而且在後臺文件中故意出錯。

正確的用戶名和密碼是admin1

調試方法以下,在後臺入口處設置斷點,而後在前臺js中調用後臺的方法處設置斷點,而後按F5啓動調試,當咱們輸入用戶名、密碼後,點擊登陸後會發現,前臺斷點被觸發了。

 

F5繼續調試,有時候會跳到jQuery的源碼中,無論他,繼續F5,會發現執行到後臺中的斷點中,以下圖

然後臺代碼的調試是十分簡單的。(PS:有時候無需在前臺設置斷點也可直接進入後臺的調試,如何不行的話,在前臺html文件或者aspx文件中認爲有可能出錯的地方設置斷點,一步步調試)

一些調試中出現的常見錯誤(會陸續更新):

1. 咱們調試到某一句代碼的時候,忽然莫名奇妙的跳出來了,實際上是剛剛執行的這一句話有異常,咱們可使用try…catch進行異常捕獲,看看異常緣由是什麼,而後作相應的處理

2. ADO.NET,咱們會使用ds.Merge()方法進行合併內存表,若是有異常的話,通常有如下三種狀況:

A.其中一張表中有兩行如出一轍的數據,包括主鍵

B.這兩張表的結構不一致

C.兩張表中某個字段的類型不匹配,如字段ageA表中式string,而在B表中確是Decimal

你們若是也有收集一些常見的錯誤,期盼可以分享

  

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

 

 


做者:Alexis
出處:http://www.cnblogs.com/alexis/
關於做者:專一於Windows Phone 七、Silverlight、Web前端(jQuery)。
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,若有問題,能夠經過shuifengxuATgmail.com  聯繫我,很是感謝。

相關文章
相關標籤/搜索