bp, bu, bm (установка точки останова)

Команды bp, bu и bm устанавливают одну или несколько точек останова программного обеспечения. Вы можете комбинировать расположения, условия и параметры, чтобы задать различные типы точек останова программного обеспечения.

User-Mode

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

Kernel-Mode

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

Параметры

Поток
Указывает поток, к которому применяется точка останова. Дополнительные сведения о синтаксисе см. в разделе Синтаксис потока. Потоки можно указать только в пользовательском режиме. Если поток не указан, точка останова применяется ко всем потокам.

ID
Задает десятичное число, идентифицирующее точку останова.

Отладчик назначает идентификатор при создании точки останова, но его можно изменить с помощью команды br (изменение нумерации точки останова). Идентификатор можно использовать для ссылки на точку останова в последующих командах отладчика. Чтобы отобразить идентификатор точки останова, используйте команду bl (список точек останова).

При использовании идентификатора в команде не вводите пробел между командой (bp или bu) и идентификатором.

Параметр ID всегда является необязательным. Если идентификатор не указан, отладчик использует первый доступный номер точки останова. В режиме ядра можно задать только 32 точки останова. В пользовательском режиме можно задать любое количество точек останова. В любом случае нет ограничений на значение идентификатора . Если заключить идентификатор в квадратные скобки ([]), идентификатор может включать любое выражение. Дополнительные сведения о синтаксисе см. в разделе Синтаксис числовых выражений.

Параметры Задает параметры точки останова. Можно указать любое количество следующих параметров, за исключением указанных ниже.

/1
Создает "однократную" точку останова. После активации этой точки останова она удаляется из списка точек останова.

/pEProcess
(только в режиме ядра) Указывает процесс, связанный с этой точкой останова. EProcess должен быть фактическим адресом структуры EPROCESS, а не PID. Точка останова активируется только в том случае, если она обнаружена в контексте этого процесса.

/tEThread
(только в режиме ядра) Указывает поток, связанный с этой точкой останова. EThread должен быть фактическим адресом структуры ETHREAD, а не идентификатором потока. Точка останова активируется только в том случае, если она обнаружена в контексте этого потока. При использовании /pEProcess и /tEThread их можно ввести в любом порядке.

/cMaxCallStackDepth
Активирует точку останова, только если глубина стека вызовов меньше MaxCallStackDepth. Этот параметр нельзя использовать вместе с параметром /C.

/CMinCallStackDepth
Активирует точку останова, только если глубина стека вызовов больше , чем MinCallStackDepth. Этот параметр нельзя использовать вместе с параметром /c.

/a
(Только для bm ) Задает точки останова для всех указанных расположений, независимо от того, находятся ли они в пространстве данных или в пространстве кода. Так как точки останова в данных могут привести к сбоям программы, используйте этот параметр только в расположениях, которые известны как безопасные.

/D
(Только для bm ) Преобразует расположения точек останова в адреса. Таким образом, при перемещении кода точки останова остаются на том же адресе, а не в соответствии с SymbolPattern. Используйте параметр /d , чтобы избежать повторной оценки изменений в точках останова при загрузке или выгрузке модулей.

/(
(Только для bm ) Включает сведения о списке параметров в строку символов, определяемую SymbolString .

Эта функция позволяет задавать точки останова для перегруженных функций с одинаковыми именами, но разными списками параметров. Например, bm /( myFunc задает точки останова для myFunc(int a) и myFunc(char a). Без "/(" точка останова, заданная для myFunc , завершается сбоем, так как она не указывает, для какой функции myFunc предназначена точка останова.

Выражение объекта /w dx Задает условную точку останова на основе логического значения, возвращаемого выражением объекта dx. Аргумент — это выражение модели данных (dx), которое принимает значение true (соответствует условию — разрыв) или false (не соответствует условию — не прерывается).

В этом примере задается условная точка останова на основе значения localVariable.

bp /w "localVariable == 4" mymodule!myfunction

В этом примере показано, как задать точку останова с помощью JavaScript.

bp /w "@$scriptContents.myFunc(localVariable)" @rip

Дополнительные сведения об объектах отладчика см. в разделе dx (отображение выражения объектной модели отладчика).

Дополнительные сведения об условных точках останова см. в разделе Установка условной точки останова.

Адрес
Указывает первый байт инструкции, в которой установлена точка останова. Если не указать адрес, используется текущий указатель инструкции. Дополнительные сведения о синтаксисе см. в разделе Синтаксис адреса и диапазона адресов.

Проходит
Указывает число проходов выполнения, на которых активирована точка останова. Отладчик пропускает расположение точки останова, пока не достигнет указанного прохода. Значение Passes может быть любым 16-разрядным или 32-разрядным значением.

По умолчанию точка останова активна при первом выполнении приложением кода, содержащего расположение точки останова. Эта ситуация по умолчанию эквивалентна значению 1 для проходов. Чтобы активировать точку останова только после того, как приложение выполнит код хотя бы один раз, введите значение 2 или более. Например, значение 2 активирует точку останова при втором выполнении кода.

Этот параметр создает счетчик, который уменьшается при каждом проходе кода. Чтобы просмотреть начальные и текущие значения счетчика Passes, используйте bl (список точек останова).

Счетчик Passes уменьшается, только если приложение выполняется после точки останова в ответ на команду g (Go). Счетчик не уменьшается, если выполняется пошаговое выполнение кода или его трассировка. Когда значение счетчика Passes достигает 1, его можно сбросить только путем очистки и сброса точки останова.

CommandString
Указывает список команд, которые выполняются при каждом обнаружении точки останова указанное количество раз. Параметр CommandString необходимо заключить в кавычки. Используйте точку с запятой для разделения нескольких команд.

Команды отладчика в CommandString могут включать параметры. Можно использовать стандартные управляющие символы C (например ,\n и \"). Точки с запятой, содержащиеся в кавычках второго уровня (\"), интерпретируются как часть внедренной строки в кавычках.

Команды CommandString выполняются только в том случае, если точка останова достигнута во время выполнения приложения в ответ на команду g (Go). Команды не выполняются, если вы выполняете пошаговое выполнение кода или трассировку после этого момента.

Любая команда, возобновляющая выполнение программы после точки останова (например , g или t), завершает выполнение списка команд.

SymbolPattern
Задает шаблон. Отладчик пытается сопоставить этот шаблон с существующими символами и установить точки останова для всех совпадений шаблонов. SymbolPattern может содержать различные подстановочные знаки и описатели. Дополнительные сведения об этом синтаксисе см. в разделе Синтаксис подстановочных знаков строк. Так как эти символы сопоставляются с символами, в сопоставлении регистр не учитывается, а один символ подчеркивания в начале (_) представляет любое количество символов подчеркивания в начале.

Среда

Элемент Описание
Режимы пользовательский режим, режим ядра
Цели Только динамическая отладка
Платформы все

Дополнительные сведения

Дополнительные сведения об использовании точек останова, других командах и методах управления точками останова, а также о том, как задать точки останова в пространстве пользователя из отладчика ядра, см. в статье Использование точек останова. Дополнительные сведения об условных точках останова см. в разделе Настройка условной точки останова.

Комментарии

Команды bp, bu и bm задают новые точки останова, но имеют разные характеристики:

  • Команда bp (Set Breakpoint) задает новую точку останова по адресу расположения точки останова, указанному в команде. Если отладчик не может разрешить адресное выражение расположения точки останова при установке точки останова, точка останова bp автоматически преобразуется в точку останова bu. Используйте команду bp , чтобы создать точку останова, которая больше не активна при выгрузке модуля.

  • Команда bu (Задать неразрешенную точку останова) задает отложенную или неразрешенную точку останова . Точка останова задается на символьной ссылке на расположение точки останова, указанное в команде (не по адресу), и активируется при разрешении модуля со ссылкой. Дополнительные сведения об этих точках останова см. в разделе Неразрешенные точки останова (bu Точки останова).

  • Команда bm (Set Symbol Breakpoint) задает новую точку останова для символов, соответствующих заданному шаблону. Эта команда может создать несколько точек останова. По умолчанию после сопоставления шаблона точки останова bm совпадают с точками останова bu . То есть точки останова bm — это отложенные точки останова, заданные для символьной ссылки. Однако команда bm /d создает одну или несколько точек останова bp . Каждая точка останова задается по адресу соответствующего расположения и не отслеживает состояние модуля.

Если вы не уверены, какая команда использовалась для задания существующей точки останова, используйте .bpcmds (Отображение команд точек останова), чтобы получить список всех точек останова вместе с командами, которые использовались для их создания.

Существует три основных различия между точками останова bp и точками останова bu :

  • Расположение точки останова bp всегда преобразуется в адрес. Если изменение модуля перемещает код, в котором была установлена точка останова bp , точка останова остается на том же адресе. С другой стороны, точка останова bu остается связанной с символическим значением (обычно символ плюс смещение), которое использовалось, и отслеживает это символьное расположение, даже если его адрес меняется.

  • При обнаружении адреса точки останова в загруженном модуле и при последующей выгрузке этого модуля точка останова удаляется из списка точек останова. С другой стороны, точки останова сохраняются после повторных выгрузок и нагрузок.

  • Точки останова, заданные с помощью bp , не сохраняются в рабочих областях WinDbg. Точки останова, заданные с помощью bu, сохраняются в рабочих областях.

Команда bm полезна, если вы хотите использовать подстановочные знаки в шаблоне символов для точки останова. Синтаксис bmSymbolPattern эквивалентен использованию x SymbolPattern , а затем использованию bu для каждого результата. Например, чтобы задать точки останова для всех символов в модуле Myprogram , которые начинаются со строки "mem", используйте следующую команду.

Пример

0:000> bm myprogram!mem* 
  4: 0040d070 MyProgram!memcpy
 5: 0040c560 MyProgram!memmove
  6: 00408960 MyProgram!memset

Так как команда bm задает точки останова программного обеспечения (не точки останова процессора), она автоматически исключает расположение данных при установке точек останова, чтобы избежать повреждения данных.

При использовании команд bp или bm /a можно указать адрес данных, а не адрес программы. Однако даже если указано расположение данных, эти команды создают точки останова программного обеспечения, а не точки останова процессора. Если точка останова программного обеспечения помещается в программные данные, а не в исполняемый код, это может привести к повреждению данных. Поэтому эти команды следует использовать в расположении данных, только если вы уверены, что память, хранящуюся в этом расположении, будет использоваться как исполняемый код, а не как программные данные. В противном случае следует использовать команду ba (Break on Access). Дополнительные сведения см. в разделе Точки останова процессора (ba Точки останова).

Дополнительные сведения о том, как задать точку останова в расположении, заданном более сложным синтаксисом, например члене открытого класса C++ или произвольной текстовой строке, содержащей символы с другим ограничением, см. в разделе Синтаксис точки останова.

Если одна логическая исходная строка охватывает несколько физических линий, точка останова устанавливается в последней физической строке оператора или вызова. Если отладчик не может установить точку останова в запрошенной позиции, он помещает точку останова в следующую допустимую позицию.

Если указать поток, то точки останова устанавливаются в указанных потоках. Например, команда ~*bp устанавливает точки останова для всех потоков, ~#bp задает точку останова в потоке, который вызывает текущее исключение, и ~123bp — точку останова в потоке 123. Команды ~bp и ~.bp задают точку останова в текущем потоке.

При отладке многопроцессорной системы в режиме ядра точки останова, заданные с помощью bp или ba (break on Access), применяются ко всем процессорам. Например, если текущий процессор равен 3 и вы вводите bp MemoryAddress , чтобы установить точку останова в MemoryAddress. Любой процессор, выполняющийся по указанному адресу (а не только процессор 3), вызывает ловушку точки останова.

Команды bp, bu и bm задают точки останова программного обеспечения, заменяя инструкцию процессора инструкцией прерывания. Для отладки кода, доступного только для чтения, или кода, который невозможно изменить, используйте команду ba e, где e представляет доступ только для выполнения.

Следующая команда устанавливает точку останова в 12 байтах после начала функции MyTest. Эта точка останова игнорируется для первых шести проходов кода, но выполнение останавливается на седьмом проходе кода.

0:000> bp MyTest+0xb 7 

Следующая команда устанавливает точку останова в RtlRaiseException, отображает регистр eax , отображает значение символа MyVar и продолжает.

kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"

Следующие две команды bm задают три точки останова. При выполнении команд отображаемый результат не различает точки останова, созданные с помощью параметра /d, и точки останова , созданные без него. Для различения этих двух типов можно использовать bpcmds (команды для отображения точек останова ). Если точка останова была создана с помощью bm без параметра /d , то отображение .bpcmds указывает тип точки останова как bu, за которым следует вычисляемый символ, заключенный в маркер @!"" (который указывает, что это литеральный символ, а не числовое выражение или регистр). Если точка останова была создана bm с параметром /d , то отображение .bpcmds указывает тип точки останова как bp.

0:000> bm myprog!openf* 
  0: 00421200 @!"myprog!openFile"
  1: 00427800 @!"myprog!openFilter"

0:000> bm /d myprog!closef* 
  2: 00421600 @!"myprog!closeFile"

0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;