vs2010斷點除錯技巧(設定條件斷點)

2021-06-22 07:03:56 字數 3752 閱讀 8354

乙個好的偵錯程式,能夠幫助程式設計師處理很多自動化的工作。試想下列的情形:

1.         錯誤是發生在乙個迴圈當中,只在迴圈遍歷了若干次以後,才會出現。

2.         錯誤只在程式中某個變數為乙個特定的值,才會出現,而這個變數的值是在程式執行的過程中隨機設定的。

3.         多個執行緒都要呼叫同乙個函式,而你只想在某幾個執行緒執行這個函式的時候,中斷程式的執行。

在上面列出來幾種情況當中,如果偵錯程式不能提供乙個有效的方法幫助我們設定斷點的話,除錯這種程式將會是很痛苦的一件事。在第一種情況當中,使用者不得不在迴圈中設定斷點,並且要記住自己按下f5的次數,1,2,3…,499,300,301…。第二種情況下,使用者還得靠一些運氣成分才能發現錯誤原因。

clr debugger的開發人員正是考慮到以上情形,給clr debugger新增了這些功能,條件斷點(conditional breakpoint)和斷點過濾器(breakpoint filters)。

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

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

記錄到達斷點次數

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

vs2010斷點除錯技巧

如何設定條件斷點 設定條件斷點非常容易。在特定的行上,按f9設定斷點。然後右擊斷點 編輯視窗左側的紅點,在上下文選單上選擇 condition 記錄到達斷點次數 有時你希望,只有當第n次滿足條件的執行到達斷點時,才中斷程式執行。例如 當第五次返回少於10份晚餐的查詢結果時,中斷程式執行。可以通過右擊...

除錯測試技巧 VS2010

本文為除錯測試總結 vs2010 位址為 除錯測試技巧總結 1.最重要是編寫 時,命名一定要規範 2.使用class view,顯示專案內定義的類,顯示各個類的內容。3.call stack可以檢視當前堆疊上的函式或過程呼叫 4.watch監視變數的值 5.hit count滿足某種條件時斷點才停下...

VS2010常用除錯技巧 1

除錯是乙個程式設計師最基本的技能,其重要性不言自明。不會除錯的程式設計師就意味著他即使會一門語言,卻不能編制出好的軟體。本文就本人在開發過程中常用的除錯技巧作下簡單呢介紹,希望對大家有所幫助,能力超群者請繞道。1 單步除錯 f10 在debug狀態下,按下f10,逐行進行除錯。2 逐句除錯 f11 ...