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

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

Режим пользователя

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

Режим ядра

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

Параметры

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

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

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

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

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

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

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

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

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

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

/C MinCallStackDepth
Активирует точку останова, только если глубина стека вызовов превышает 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 (список точек останова).

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

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

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

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

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

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

Среда

Позиция Description
Режимы режим пользователя, режим ядра
Целевые объекты только динамическая отладка
Платформы all

Дополнительная информация

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

Замечания

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

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

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

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

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

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

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

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

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

Команда bm полезна, если вы хотите использовать подстановочные знаки в шаблоне символов для точки останова. Синтаксис bm SymbolPattern эквивалентен использованию 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, и вы вводите 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, а затем вычисляемый символ, заключенный в токен @!"" (который указывает, что это литеральный символ, а не числовое выражение или регистр). Если точка останова была создана с помощью переключателя /d, отображается .bpcmds, указывающий тип точки останова в секунду в секунду.

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 ;