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


Условные точки останова в WinDbg и других отладчиках Windows

Условные точки останова в WinDbg и других отладчиках Windows полезны, когда нужно остановить выполнение программы только в том случае, если выполнено определенное условие.

С помощью параметра "/w" создается условная точка останова с помощью команды bp (Установить точку останова) или другой команды точки останова. Базовый синтаксис команды:

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

Точка останова приведет к срабатыванию в отладчике только при выполнении указанного условия. "w" — это сокращение для "когда". Выражение условия может представлять собой любое выражение, которое можно использовать с командой 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`

Поломка произойдет при выполнении строки 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}"