天天看點

一起談.NET技術,C#調試心經(續)

  斷點篇

  命中次數(Hit Counts)

  右擊斷點,可以設定Hit Counts(命中次數),會彈出如下的對話框:

一起談.NET技術,C#調試心經(續)

  當條件滿足的時候斷點會被命中(即即将被執行),這個命中次數是斷點被命中的次數。預設是始終break,選項有如下的幾種:始終break;當命中次數達到多少次時break;當命中次數是多少的倍數時break;當命中次數大于等于多少的時候break。

一起談.NET技術,C#調試心經(續)

  于是在上篇中的條件也可以這樣實作,設定命中次數等于50的時候break,按F5後,斷點被觸發,此時i=50。

  斷點過濾器

  我們可以限制斷點在特定的處理器和程序中。可以設定機器名、程序id、程序名、線程id、線程名中的某些條件來過濾一些斷點。

一起談.NET技術,C#調試心經(續)

  注意:ThreadId需要特别說明一下,ThreadId并不是托管程式中,.NET 架構中System.Threading.Thread.ManagedThreadId,兩者不能等同。簡單來說,ManagedThreadId是線程在CLR中的辨別符,而ThreadId卻是線程在作業系統中的辨別符。是以ThreadId需要從調試器中的“Threads”視窗中擷取。

  斷點條件

  我們可以設定斷點達到的條件,如下圖,我們設定表達式為i==5(注意是判相等,而不是指派的等于),按F5,斷點再次被觸發,此時i=50。

一起談.NET技術,C#調試心經(續)

  還有一個選項是已經被改變,則裡面條件是具體的變量,如我們的代碼如下:

private void ConditionDebug()

{

int hitCount = 0;

for (int i = 0; i < 100; i++)

if (i==49)

hitCount = 1;

}

Console.Write("Hit Count={0}", hitCount);

  我們在代碼裡如果i==49,就将hitCount的值改變,同時設定斷點的條件為:

一起談.NET技術,C#調試心經(續)

  則當斷點再次被觸發的時候此時i=50。這個通常被用在找變量的時在什麼時候發生改變。

  斷點的位置

  可以設定斷點的位置,如下圖,設定程式到達那個檔案的第幾行第幾個字元時觸發斷點。

一起談.NET技術,C#調試心經(續)

  斷點觸發時

  我們可以設定斷點到達時做一些其他的事情,如列印消息,運作一個宏。

一起談.NET技術,C#調試心經(續)

  自定義調用堆棧

  堆棧跟蹤時vs一步步執行你的程式是對目前的方法調用繼承關系的直覺顯示。在調試程式時,我們會經過一個又一個方法,包括方法的嵌套調用。堆棧跟蹤會對這當中的每一層方法作出記錄。選擇“調試-->視窗-->調用堆棧”,或者是快捷鍵Ctrl+Alt+C就可以看到目前的堆棧跟蹤狀态。這裡會将每個方法單獨顯示為一行,并且帶有行号和參數值。每一個新的方法調用被稱為堆棧幀。

一起談.NET技術,C#調試心經(續)

  堆棧跟蹤是廣為人知的調試工具,它的優點在于你可以輕按兩下任意一行跳轉到程式中該層調用方法的代碼。于是你可以看到程式是如何執行到這一位置的,同時可以看到方法接受的參數值。并且可以使用Ctrl+C将一個或者全部堆棧幀複制到剪貼闆,并将這個方法的調用資訊發送給工作夥伴。

  項目屬性中的Debug頁籤

  如果你的項目是Console項目(控制台應用程式)或者是WinForm項目,則右擊項目解決方案,選擇屬性,會出來如下的項目屬性窗體。 

一起談.NET技術,C#調試心經(續)

  我們可以設定“啟動動作”、“啟動選項”和“是否啟用調試”。

  Start Action有三個選擇項:

  Start Project:預設選項,設定為啟動項目。

  Start external program:調試的時候啟動内部程式。

  Start browser with URL:調試的時候打開URL位址。

  使用Trace.axd調試ASP.NET

  在以前asp時候,我們為了檢視某個變量的值,通常會使用Response.Write方法。可能現在許多ASP.NET程式員也習慣在背景使用Response.Write方法将變量的值寫出來,其實微軟提供了很好的調試工具,即Trace.axd。它的功能主要是:配置 ASP.NET 代碼跟蹤服務以控制如何收集、存儲和顯示跟蹤結果。

  關鍵的幾個選項:

  1、localOnly 預設為false。這個很好了解。如果為true,隻在本地輸出跟蹤資訊。

  2、enabled 是否啟用跟蹤。

  3、pageOutput  指定在每一頁的結尾是否呈現跟蹤輸出。如果是 false ,則隻能通過跟蹤實用工具通路跟蹤輸出。

  4、requestLimit  指定在伺服器上存儲的跟蹤請求的數目。最大為10000,預設為10

  5、traceMode  指定顯示跟蹤資訊的順序。SortByCategory或 SortByTime(預設)

  關于更多可以參考

  http://msdn.microsoft.com/zh-cn/library/6915t83k%28VS.80%29.aspx

  下面以一個小Demo來說明怎麼使用Trace.axd來調試ASP.NET

  1、建立一個Web項目,取名為WebTraceTest

  2、編輯web.config檔案,添加trace節點(在)

  内容如下:

<trace enabled="true" localOnly="true"

pageOutput="true"

requestLimit="15"

mostRecent="true" />

  3、建立一個頁面,取名為Test.aspx,在裡面增加一個文本框和一個按鈕(都是伺服器端的控件)。

  按下F5,開始調試,會發現出現如下界面:

一起談.NET技術,C#調試心經(續)

  5、在文本框中輸入文字,如Alexis,點選按鈕,會發現Form Collection中會有詳細的資訊,如下:

一起談.NET技術,C#調試心經(續)

  說明:使用Trace.axd我們可以獲得以下資訊:

  Request Details:請求的詳細資訊

  Trace Information:跟蹤資訊

  Control Tree:控件樹

  Session State:會話狀态

  Application State:應用程式狀态

  Request Cookies Collection:請求Cookie集合

  Response Cookies Collection:響應Cookie集合

  Headers Collection:标頭集合

  Response Headers Collection:響應标頭集合

  Form Collection:窗體集合

  Querystring Collection:QueryString集合(即Url中?後面的字元串的資訊)

  Server Variables:伺服器變量

  将Visual Studio與一個運作中的程序連接配接

  當你按下F5對程式開始調試時,VS.NET會對項目進行生成(如果有必要的話)并以調試模式啟動程式。也就是說,隻要項目位于debug版本的程式集中,VS.NET就與運作得程式之間建立了連接配接,以便對斷點等與調試相關的方法作出反應。

  不過有些時候,我們需要或者想要對正在運作得Visual Studio之外啟動的程序進行調試。當程序位于debug版本的程式集中,這是可以做到的。

  1、選擇“工具—>調試程序”列出所有正在運作得程式,如下圖:

一起談.NET技術,C#調試心經(續)

  2、選擇自己感興趣的程序,點選連接配接,此時Visual Studio自動切換到了調試模式。

  3、打開Progress視窗,發現我們剛剛選擇的程序在清單中,如下圖: 

一起談.NET技術,C#調試心經(續)

  這一技巧可以讓你對Windows服務程序進行調試。編寫Windows服務程序時,你無法按F5啟動調試,因為它們必須先通過管理工具安裝後啟動才能運作。如果你在調試模式下生成并安裝服務程式,就可以使用這一技巧進行調試。

  而且你可以對SQL存儲過程使用同樣的方式進行調試。如果你安裝了SQL Server調試元件,并且有足夠的權限,就可以連接配接到SQL Server的程序,并在伺服器中為存儲過程設定斷點來一步步執行。

  調試Visual Studio中的多個項目

  在實際開發中,我們往往分了許多層,有許多的項目集合在一個解決方案下。我們可以右擊要調試的項目選擇“調試--> 運作新執行個體”來實作調試這個項目。我也可以右擊解決方案,選擇多項目調試,如下圖:

一起談.NET技術,C#調試心經(續)

  我們還可以設定項目的期待順序。在用戶端/伺服器(CS結構)程式中,我們可以使用這一方法來確定伺服器端程式在用戶端程式之前運作。

  隻在特定類型的異常時中斷

  一個健壯的程式會在運作時處理所有可能出現的異常。不過開發者在調試複雜的程式時會覺得這樣有些麻煩。因為所有的異常都被處理掉了。在出現任何異常時,Visual Studio不會再進行處理,或者中斷代碼來對使用者作出提示。

  幸運的是Visual Studio有個選項可以讓開發者指定他們關心的異常類型。選擇菜單欄à調試à異常,或者使用快捷鍵Ctrl+Alt+E。如下圖:

一起談.NET技術,C#調試心經(續)

  我們可以看到一個樹狀結構列出所有VS可以監視到的異常。

  後面的兩個勾選框的意思分别為是否被抛出和使用者是否不處理。 

   參考

  《Visual Studio.NET使用技巧手冊》

  http://msdn.microsoft.com/