WinDbg 和其他 Windows 調試程式中的條件斷點
當您只有在滿足特定條件時,WinDbg 和其他 Windows 調試程式中的條件斷點才很有用。
使用 bp (Set Breakpoint) 或其他斷點命令的 “/w” 參數建立條件斷點。 命令的基本語法為:
0:000> bp /w "(Condition)" Address
當指定的條件為 true 時,斷點只會造成調試程式的中斷。 “w” 是 “when” 的縮寫。 條件表達式可以是任何可與 dx (顯示除錯程式物件模型表示式) 命令搭配使用的任何專案。 這包括大部分的 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 腳本視窗或 包含名為 “myFunc” 的函式的 .scriptload (Load Script) 命令載入腳本,您可以設定如下的斷點:
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}"