Условные точки останова в WinDbg и других отладчиках Windows
Условные точки останова в WinDbg и других отладчиках Windows полезны, если требуется разрыв только в том случае, если определенное условие удовлетворено.
С помощью параметра "/w" создается условная точка останова в секунду (установка точки останова) или другая команда точки останова. Базовый синтаксис команды:
0:000> bp /w "(Condition)" Address
Точка останова приведет только к разрыву отладчика, если указанное условие имеет значение true. "w" — это сокращение для "когда". Выражение условия может быть любым, что можно использовать с командой 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`
При выполнении строки 143 из mysource.cpp переменная myVec имеет 4 элемента.
Кроме natvis, можно также вызвать функцию JavaScript. Если вы загружаете скрипт с помощью окна скрипта WinDbg или команды .scriptload (Load Script), содержащей функцию 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, а затем команды GC (Перейти от условной точки останова). Хотя эти методы настройки условных точек останова больше не рекомендуется, они по-прежнему работают и могут видеть этот синтаксис, на который ссылается другие источники.
Базовый синтаксис условной точки останова с помощью команды j выглядит следующим образом:
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
Базовый синтаксис для условной точки останова с помощью маркера .if выглядит следующим образом:
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"