VS2010中的偵錯技巧

  • 25240
  • 0
  • 2011-06-16

摘要:VS2010中的偵錯技巧

原文發表位置:Debugging Tips with Visual Studio 2010
原文發表時間:Wednesday, August 18, 2010 9:48 PM

這是我的部落格中關於VS 2010和.NET 4發佈系列的第二十六篇文章。

今天的文章將介紹Visual Studio中的一些實用偵錯技巧。這是受我朋友Scott Cate (他發表過幾十篇很棒的VS技術文章) 啟發。他最近告訴我,許多Visual Studio下的程式設計師,甚至一些很有經驗的開發人員,都不知道這些技巧。希望這篇文章能幫你掌握這些技巧。它們都很簡單,卻能幫你節約大量的時間。

跳到當前游標處(Ctrl+F10)

我經常看到人們為了到達目標程式碼位置,而在程式中早早設定了中斷點,然後反覆地按F10/F11,一步步走到目標程式碼處。當程式設計師的確需要仔細觀察每一步的狀態變化時, F10/F11是合理的選擇。然而多數情況下,人們只想快速到達他們真正關心的程式碼處,這時候F10/F11就不是最佳選擇了。

這時,你應該利用「跳到當前游標處」這個功能。先把光標定位在要測的目標程式碼行上,再按Ctrl + F10,被測程式將直接跳到該行停下。你再也不用按許多次F10/F11了。即使目標程式碼位於獨立的類別或方法中,你仍然可以從目前正在檢查的地方跳過去。

條件中斷 (Conditional Breaking)

另一種常見的情況是:開發人員設置中斷點,執行程式,利用不同的輸入資料以觸發中斷點,然後在中斷點處手工檢查是否滿足某些特定的條件,從而決定是否繼續調查。如果目前場景不是他們想要的,按F5繼續執行程式,嘗試別的輸入,手動重覆剛才的過程。

針對上述情況,Visual Studio提供了一個方便得多的功能——「條件中斷」。只有當程式滿足了開發人員預設的條件後,條件中斷點才會被觸發,偵錯器中斷。這將避免頻繁地手工檢查/恢復程式執行,大量減少偵錯過程中的手工和繁瑣工作。

如何設置條件中斷點

設置條件中斷點非常容易。在特定的程式行,按F9設置中斷點。

然後以右鍵點按中斷點,於編輯窗口左側的紅點,在彈出選單上選擇「Condition…」。


這時彈出一個對話盒供你設置啟動該中斷點所需的條件。比如:我們希望只有當區域變數 paginatedDinners 的大小小於10時,偵錯才中斷。我們可以寫出如下的陳述式:


現在我再執行這個程式,實作搜尋,只有傳回值小於10時,程式執行才會被中斷。對於大於10的值,該中斷點將被跳過。

記錄到達中斷點次數

有時你希望,只有當第N次滿足條件的運行到達中斷點時,才中斷程式執行。例如:當第五次傳回少於10份晚餐的查詢結果時,中斷程式執行。
可以用右鍵點按中斷點,然後在彈出選單上選擇「Hit count…」選單命令實作。

這時系統彈出一個對話框,它允許你指定:(1)當滿足條件,而且進入中斷點的累計次數等於N時,中斷點停止一次。(2)當滿足條件,而且進入中斷點的累計次數是N的倍數時,中斷點停止一次。(3)當滿足條件,而且進入中斷點的累計次數大於N時,每次於中斷點中停止。

機器/執行緒/行程過濾

設置如下:以右鍵點按中斷點;在彈出選單上選擇「Filter…」選單命令,然後指定命中中斷點的特定條件:在指定的機器上、或指定的行程中、或指定的執行緒中。

跟蹤點—進入中斷點時的自訂操作

許多人不知道「跟蹤點(TrackPoints)」這個偵錯功能。「跟蹤點」是種特殊的中斷點,當它被命中時,它會觸發一系列自訂操作。如果你想觀察程序的行為,而又不想中斷偵錯的時候,這個功能尤其有用。

我將用一個簡單的控制台程序來 Demo 如何使用「跟蹤點」。如下是斐波那契數列的一個遞迴實作:

以上程式中,我們使用Console.WriteLine() 輸出針對特定輸入值生成的最終斐波那契數列。如果希望在偵錯器裡觀察操作中每一次遞迴運算後的數列而又不實際中斷程序運行,該怎麼辦呢?「跟蹤點」可以輕鬆實現。

設置跟蹤點

你可以在特定的行上,按F9加跟蹤點。然後以右鍵點按中斷點,在彈出選單中選擇「When Hit…」:

在彈出對話盒上,你可以設置命中該中斷點時,所觸發的事件。

在上面例子中,我們設定一旦命中中斷點時就列印追蹤信息。注意,我們已經把區域變數「x」的值,作為追蹤訊息的一部分輸出。區域變數可以透過 {變數名} 語法輸出。你還可以利用系統內建的命令($CALLER, $CALLSTACK, $FUNCTION等等),在追蹤訊息中輸出常用的偵錯值。

在上例中,我們同時選中了底端的「continue execution」選項,這說明我們不希望程序中斷偵錯狀態,而是繼續執行。唯一的不同是:每次中斷點條件滿足時,我們的自訂追蹤訊息都將被輸出。

現在當我們執行程式時,會發現自訂追蹤訊息自動顯示在Visual Studio的「輸出」視窗裡。這讓我們很容易看到程序的遞迴呼叫過程:

你也可以選擇往應用程式中添加一個自訂追蹤信息的監聽器。這時追蹤點的輸出信息將通過它輸出,而不是Visual Studio的「輸出「窗口。

跟蹤點—執行自訂巨集 (Macro)

上周,我在倫敦演講時,有聽眾問道:當命中跟蹤點時,能否自動輸出所有的區域變數?

Visual Studio 中並沒有這樣的內建功能,但我們可以寫一個自訂巨集來實現,然後在命中跟蹤點時呼叫該巨集。這個實作需要先打開 Visual Studio 的巨集編輯器(工具->巨集->巨集IDE選單命令),然後在專案資源管理器的 MyMacros 節點下選擇一個模組或建立新模組(如:加個名為「UsefulThings」的模組),再把下面的VB巨集程式碼貼到模組中並儲存。
Sub DumpLocals()
   Dim outputWindow As EnvDTE.OutputWindow
   outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object

   Dim currentStackFrame As EnvDTE.StackFrame
   currentStackFrame = DTE.Debugger.CurrentStackFrame

   outputWindow.ActivePane.OutputString(「*Dumping Local Variables*」 + vbCrLf)
   For Each exp As EnvDTE.Expression In currentStackFrame.Locals
      outputWindow.ActivePane.OutputString(exp.Name + 」 = 」 + exp.Value.ToString() + vbCrLf)
   Next
End Sub

上述巨集程式碼將迴圈當前的堆疊,把所有的區域變數輸出到「輸出」視窗。

使用自訂的「DumpLocals」巨集

然後,我們可以在如下的一個簡單程式中使用剛自訂的「DumpLocals」巨集了:

上述程式碼中,我們用F9在「Add」方法的傳回值處加了個中斷點,然後以右鍵點按中斷點,在彈出選單上選擇「When hit」。

將顯示如下對話框。和之前不一樣, 我們不選「Print a message」選項,也不手動設定需要輸出的變數;而是選擇「Run a marco」複選框,並指定到我們上面建立的 UsefulThings.DumpLocals 巨集上:

為了使程式能在命中跟蹤點後仍繼續運行,我們將繼續選中「continue execution」複選框。

運行程序

現在按F5執行程式,當「Add」方法被呼叫時,我們會在Visual Studio的「輸出」窗口中看到如下結果。注意命中跟蹤點時,巨集會自動列出每個區域變數的名稱和值:

總結

Visual Studio的偵錯程式功能極其豐富,我強烈建議大家花些時間去掌握它的所有功能。上述技巧是大家平時很少注意的那些功能中的一小部分。

我之前寫過關於VS 2010 偵錯器改進的文章(包括固定資料提示窗、進入/移出中斷點、保留上次變數的值,等等)。以後我還會發表更多關於VS 2010的新智慧提示和文件偵錯訊息的轉存支援的文章。這些技術賦予開發人員強大的偵錯能力,使偵錯程序(包括發行後的產品)變得更容易,更強大。

如果想學習更多Visual Studio知識,請參考Scott Cate的Visual Studio 2010知識與技巧系列。他發表了一系列精彩的免費影片和文章。

也可以參考 Jim Griesmer的Visual Studio偵錯技巧系列。他有著豐富的知識可供大家學習。

希望對大家有幫助。

Scott

補充:在本文之外,我還使用Twitter做快速更新和共享,地址是twitter.com/scottgu

free counters