以vs2010為例 (32位控制臺程序)。
1. 程序入口函數(shù)位于ntdll模塊:RtlUserThreadStart? --》RtlInitializeExceptionChain --》__RtlUserThreadStart---》BaseThreadInitThunk --->mainCRTStartup-->__tmainCRTStartup -->main(我們的入口)。
在main函數(shù)位置下斷點,按下F5執(zhí)行,按下alt + 7,可以看到調(diào)用堆棧,

2. 設(shè)置條件斷點
在如圖位置,按下F9設(shè)置斷點。

按下alt+F9, 在設(shè)置條件的斷點上點擊鼠標右鍵,選擇Condition項,在彈出的對話框中,輸入條件。條件表達式的寫法跟C語法一致。

設(shè)置好之后,斷點變成帶十字花的紅點。F5運行,直到條件成立,斷點才斷下。
如何設(shè)置條件斷點
設(shè)置條件斷點非常容易。在特定的行上,按F9設(shè)置斷點。
然后右擊斷點–編輯窗口左側(cè)的紅點,在上下文菜單上選擇“Condition…”。
這時彈出一個對話框供你設(shè)置激活該斷點所需的條件。比如:我們希望只有當(dāng)局部變量paginatedDinners的尺寸小于10時,調(diào)試才中斷。我們可以寫出如下的表達式:
現(xiàn)在我再運行這個程序,實現(xiàn)搜索,只有返回值小于10時,程序運行才會被中斷。對于大于10的值,該斷點將被跳過。
記錄到達斷點次數(shù)
有時你希望,只有當(dāng)?shù)贜次滿足條件的運行到達斷點時,才中斷程序運行。例如:當(dāng)?shù)谖宕畏祷厣儆?0份晚餐的查詢結(jié)果時,中斷程序運行。
可以通過右擊斷點,然后在彈出菜單上選擇“Hit count…”菜單命令實現(xiàn)。
這時系統(tǒng)彈出一個對話框,它允許你指定:(1)當(dāng)滿足條件,而且進入斷點的累計次數(shù)等于N時,斷點命中一次。(2)當(dāng)滿足條件,而且進入斷點的累計次數(shù)是N的倍數(shù)時,斷點命中一次。(3)當(dāng)滿足條件,而且進入斷點的累計次數(shù)大于N時,每次命中斷點。
機器/線程/進程過濾
設(shè)置如下:右擊斷點;在彈出菜單上選擇“Filter…”菜單命令;然后指定命中斷點的特定條件:在指定的機器上、或指定的進程中、或指定的線程中。
跟蹤點—進入斷點時的自定義操作
許多人不知道“跟蹤點(TrackPoints)”這個調(diào)試功能?!案欬c“是種特殊的斷點,當(dāng)它被命中時,它會觸發(fā)一系列自定義操作。如果你想觀察程序的行為,而又不想中斷調(diào)試的時候,這個功能尤其有用。
我將用一個簡單的控制臺程序來演示如何使用“跟蹤點”。如下是斐波那契數(shù)列的一個遞歸實現(xiàn):
以上程序中,我們使用Console.WriteLine() 輸出針對特定輸入值生成的最終斐波那契數(shù)列。如果希望在調(diào)試器里觀察操作中每一次遞歸運算后的數(shù)列而又不實際中斷程序運行,該怎么辦呢?“跟蹤點”可以輕松實現(xiàn)。
設(shè)置跟蹤點
你可以在特定的行上,按F9加跟蹤點。然后
右擊斷點,在上下文菜單中選擇“When Hit…”:
在彈出對話框上,你可以設(shè)置命中該斷點時,所觸發(fā)的事件。
在上面例子中,我們設(shè)定一旦命中斷點時就打印追蹤信息。注意,我們已經(jīng)把局部變量“x”的值,作為追蹤信息的一部分輸出。局部變量可以通過{變 量名}語法輸出。你還可以利用系統(tǒng)內(nèi)置的命令($CALLER, $CALLSTACK, $FUNCTION等等),在追蹤信息中輸出常用的調(diào)試值。
在上例中,我們同時選中了底端的“continue execution“選項,這說明我們不希望程序中斷調(diào)試狀態(tài),而是繼續(xù)運行。唯一的不同是:每次斷點條件滿足時,我們的自定義追蹤信息都將被輸出。
現(xiàn)在當(dāng)我們運行程序時,會發(fā)現(xiàn)自定義追蹤信息自動顯示在Visual Studio的“輸出“窗口里。這讓我們很容易看到程序的遞歸調(diào)用過程:
你也可以選擇往應(yīng)用程序中添加一個自定義追蹤信息的監(jiān)聽器。這時追蹤點的輸出信息將通過它輸出,而不是Visual Studio的“輸出“窗口。
五、跟蹤點—運行自定義的宏
當(dāng)命中跟蹤點時,能否自動輸出所有的局部變量?
Visual Studio中并沒有這樣的內(nèi)置功能,但我們可以寫一個自定義宏來實現(xiàn),然后在命中跟蹤點時調(diào)用該宏。這個的實現(xiàn)需要先打開Visual Studio的宏編輯器(工具->宏->宏IDE菜單命令),然后在項目資源管理器的MyMacros節(jié)點下選擇一個模塊或創(chuàng)建新模塊(如:加個名為“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
上述宏代碼將循環(huán)當(dāng)前的堆棧,把所有的局部變量輸出到“輸出”窗口。
使用自定義的“DumpLocals”宏
然后,我們可以在如下的一個簡單程序中使用剛定制的“DumpLocals”宏了:
上述代碼中,我們用F9在“Add”方法的返回值處加了個斷點,然后右擊斷點,在彈出菜單上選擇“When hit”。
將顯示如下對話框。和之前不一樣, 我們不選“Print a message”選項,也不手工設(shè)定需要輸出的變量;而是選擇“Run a marco”復(fù)選框,并指定到我們上面創(chuàng)建的UsefulThings.DumpLocals宏上:
為了使程序能在命中跟蹤點后仍繼續(xù)運行,我們將繼續(xù)選中“continue execution”復(fù)選框。
運行程序
現(xiàn)在按F5運行程序,當(dāng)“Add”方法被調(diào)用時,我們會在Visual Studio的“輸出”窗口中看到如下結(jié)果。注意命中跟蹤點時,宏會自動列出每個局部變量的名稱和值:
https://www.cnblogs.com/dsky/archive/2013/05/14/3078234.html