WinDbg 和其他 Windows 調試程式中的條件斷點

只有在滿足特定條件時,WinDbg 和其他 Windows 調試程式中的條件斷點才適合使用。

使用 bp (設定斷點) 或其他斷點命令的 “/w” 參數建立條件斷點。 命令的基本語法為:

0:000> bp /w "(Condition)" Address

斷點只會在指定的條件為 true 時造成調試程式中斷。 “w” 是 “when” 的縮寫。 條件表達式可以是任何可以搭配 dx (Display Debugger Object Model Expression) 命令使用的任何專案。 這包括大部分的 C++ 樣式運算式,包括比較、算術、指標運算等等。 例如,只有在變數超過 20 時才會中斷的基本條件斷點,可以寫入為:

0:000> bp /w "MyVar > 20" `mysource.cpp:143`

由於條件是使用調試程序物件模型進行評估,因此您也可以利用 NatVis 支援之類的專案。 例如,假設 myVec 是 std::vector<int>,您可以建立條件,例如:

0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`

當 myVec 變數有 4 個專案時,執行第 143 行mysource.cpp時,這會中斷。

除了 natvis 之外,您也可以叫用 JavaScript 函式。 如果您使用 WinDbg 腳本視窗或 .scriptload (載入腳本) 命令載入腳本,其中包含名為 “myFunc” 的函式,您可以設定如下的斷點:

0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`

如需在調試程式中撰寫 JavaScript 函式和延伸模組的詳細資訊,請參閱 JavaScript 調試程式腳本

雖然較高層級的表達式通常最有用,但也可以使用這些表達式來評估緩存器。 例如,您可以建立斷點,只在堆疊指標達到一些臨界值時觸發:

0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`

舊版條件斷點語法

在斷點命令的 「/w」 參數可用性之前,設定條件斷點的建議方式是使用 j (Execute If - Else) 命令或 .if token,後面接著 gc (Go from Conditional Breakpoint) 命令。 雖然不再建議使用這些設定條件斷點的方法,但它們仍可運作,而且您可能會看到其他來源所參考的這個語法。

使用 j 命令的條件斷點基本語法如下:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

使用 .if Token 的條件斷點的基本語法如下:

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"