Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Условные точки останова в 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}"