1. 程式人生 > >VS2010斷點除錯技巧(轉)

VS2010斷點除錯技巧(轉)

如何設定條件斷點

  設定條件斷點非常容易。在特定的行上,按F9設定斷點。

  然後右擊斷點–編輯視窗左側的紅點,在上下文選單上選擇“Condition…”。

  這時彈出一個對話方塊供你設定啟用該斷點所需的條件。比如:我們希望只有當局部變數paginatedDinners的尺寸小於10時,除錯才中斷。我們可以寫出如下的表示式:

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

  記錄到達斷點次數

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

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

  機器/執行緒/程序過濾

  設定如下:右擊斷點;在彈出選單上選擇“Filter…”選單命令;然後指定命中斷點的特定條件:在指定的機器上、或指定的程序中、或指定的執行緒中。

  跟蹤點—進入斷點時的自定義操作

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

  我將用一個簡單的控制檯程式來演示如何使用“跟蹤點”。如下是斐波那契數列的一個遞迴實現:

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

  設定跟蹤點

  你可以在特定的行上,按F9加跟蹤點。然後
  右擊斷點,在上下文選單中選擇“When Hit…”:

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

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

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

  現在當我們執行程式時,會發現自定義追蹤資訊自動顯示在Visual Studio的“輸出“窗口裡。這讓我們很容易看到程式的遞迴呼叫過程:

  你也可以選擇往應用程式中新增一個自定義追蹤資訊的監聽器。這時追蹤點的輸出資訊將通過它輸出,而不是Visual Studio的“輸出“視窗。

五、跟蹤點—執行自定義的巨集

當命中跟蹤點時,能否自動輸出所有的區域性變數?

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的“輸出”視窗中看到如下結果。注意命中跟蹤點時,巨集會自動列出每個區域性變數的名稱和值:

轉自:http://www.cnblogs.com/dsky/archive/2013/05/14/3078234.html