共用方式為


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

WinDbg 和其他 Windows 偵錯工具中的條件式中斷點,當您只有在滿足特定條件時才需要中斷時,會很有用。

使用「/w」參數建立條件式岔斷點,以達到 bp (設定岔斷點) 或其他岔斷點指令。 該命令的基本語法是:

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 個元素時執行 mysource.cpp 的第 143 行時,這將中斷。

除了 natvis 之外,您還可以調用 JavaScript 函數。 如果您使用 WinDbg 腳本視窗或包含名為 「myFunc」 函式的 .scriptload (載入腳本) 命令載入腳本,您可以設定如下所示的中斷點:

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

如需在偵錯工具中撰寫 JavaScript 函式和延伸模組的詳細資訊,請參閱 JavaScript 偵錯工具腳本

雖然更高層級的運算式通常是最有用的,但也可以使用這些運算式來評估暫存器。 例如,您可以建立只有在堆疊指標達到某個閾值時才觸發的中斷點:

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

舊版條件式中斷點語法

在中斷點指令提供 “/w” 參數之前,設定條件式中斷點的建議方式是使用 j (執行 If - Else) 指令或 .if 權杖,後面接著 gc (從條件式中斷點移轉) 指令。 雖然不再建議使用這些設定條件式中斷點的方法,但它們仍然有效,而且您可能會在其他來源中看到此語法的參考。

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

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

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

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