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


ba (перерыв на доступе)

Команда ba задает точку останова процессора (часто называемую менее точной точкой останова данных). Эта точка останова активируется при доступе к указанной памяти.

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

[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Режим ядра

ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Параметры

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

Идентификатор
Указывает необязательное число, определяющее точку останова. Если идентификатор не указан, используется первый доступный номер точки останова. Нельзя добавить пробел между ba и номером идентификатора. Каждый процессор поддерживает только ограниченное количество точек останова процессора, но нет ограничений на значение номера идентификатора. Если идентификатор заключен в квадратные скобки ([]), идентификатор может включать любое выражение. Дополнительные сведения о синтаксисе см. в разделе "Синтаксис числовых выражений".

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

Вариант Действие

e (execute)

Прерывается в отладчик, когда ЦП получает инструкцию из указанного адреса.

r (чтение и запись)

Прерывается в отладчик, когда ЦП считывает или записывает данные по указанному адресу.

w (запись)

Прерывается в отладчик при записи ЦП по указанному адресу.

i (i /o)

(Только в режиме ядра, только системы на основе x86) Прерывается в отладчик при доступе к порту ввода-вывода по указанному адресу .

Размер
Задает размер расположения в байтах для отслеживания доступа. На процессоре на основе x86 этот параметр может быть 1, 2 или 4. Однако если Access равен e, размер должен иметь значение 1.

В процессоре на основе x64 этот параметр может быть 1, 2, 4 или 8. Однако если Access равен e, размер должен иметь значение 1.

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

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

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

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

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

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

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

В этом примере устанавливается условная точка останова на основе значения globalVariable. Это позволяет точке останова доступа, например, проверить значение, записанное при определении того, должен ли отладчик сломаться.

ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable

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

ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable

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

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

Адрес
Указывает любой допустимый адрес. Если приложение обращается к памяти по этому адресу, отладчик останавливает выполнение и отображает текущие значения всех регистров и флагов. Этот адрес должен быть смещением и соответствующим образом выровнен для соответствия параметру Size . (Например, если Размер равен 4, адрес должен быть кратным 4.) Если не указан адрес, используется указатель текущей инструкции. Дополнительные сведения о синтаксисе см. в разделе "Синтаксис адреса и диапазон адресов".

Проходит
Указывает количество раз, когда точка останова передается до его активации. Это число может быть любым 16-разрядным значением. Количество раз, когда счетчик программы проходит через эту точку без разрыва, меньше, чем значение этого числа. Таким образом, опущение этого числа совпадает с параметром 1. Обратите внимание, что это число подсчитывает только время выполнения приложения за эту точку. Пошаговые действия или трассировка за эту точку не учитываются. После достижения полного количества можно сбросить это число только с помощью очистки и сброса точки останова.

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

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

Это необязательный параметр.

Среда

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

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

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

Замечания

Отладчик использует идентификатор, чтобы ссылаться на точку останова в последующих bc (точка останова clear), bd (отключить точку останова) и быть (включить точку останова).

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

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

Каждая точка останова процессора имеет размер, связанный с ним. Например, точку останова процессора w (write) можно задать в адресе 0x70001008 размером 4 байта. Это позволит отслеживать блок адресов от 0x70001008 до 0x7000100B включительно. Если этот блок памяти записывается, точка останова будет активирована.

Это может произойти, что процессор выполняет операцию в области памяти, которая перекрывается , но не идентична указанному региону. В этом примере одна операция записи, содержащая диапазон 0x70001000 для 0x7000100F, или операция записи, которая включает только байт в 0x70001009, будет перекрывающейся операцией. В такой ситуации, активируется ли точка останова процессором. Чтобы получить подробные сведения, обратитесь к руководству по обработчику. Чтобы взять один конкретный экземпляр, на процессоре x86 точка чтения или записи активируется всякий раз, когда доступ к диапазону перекрывает диапазон точек останова.

Аналогичным образом, если точка останова e (execute) задана в адресе 0x00401003, а затем выполняется двухбайтовая инструкция, охватывая адреса 0x00401002 и 0x00401003, результат зависит от процессора. Опять же, обратитесь к руководству по архитектуре процессора, чтобы получить подробные сведения.

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

Чтобы применить существующие точки останова данных текущего процесса к другому контексту регистра, используйте команду .apply_dbp (Применить точку останова данных к контексту).

На компьютере с несколькими процессорами каждая точка останова процессора применяется ко всем процессорам. Например, если текущий процессор равен 3, и вы используете команду ba e1 MyAddress , чтобы поместить точку останова в MyAddress, любой процессор - не только процессор 3- который выполняется в этом адресе, активирует точку останова. (Это также относится к точкам останова программного обеспечения.)

Невозможно создать несколько точек останова процессора в одном адресе, которые отличаются только в значениях CommandString . Однако можно создать несколько точек останова в одном адресе с различными ограничениями (например, разные значения параметров /p, /t, /c и /C).

Дополнительные сведения о точках останова процессора и дополнительных ограничениях, которые применяются к ним, см. в статьях "Точки останова процессора" (точки останова ba).

В следующих примерах показана команда ba . Следующая команда задает точку останова для доступа на чтение 4 байта переменной myVar.

0:000> ba r4 myVar

Следующая команда добавляет точку останова ко всем последовательным портам с адресами из 0x3F8 до 0x3FB. Эта точка останова активируется, если что-либо считывается или записывается в эти порты.

kd> ba i4 3f8