Поделиться через


Условные точки останова в 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}"