Точки останова процессора (точки останова ba)

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

Обратите внимание , что термин точки останова данных часто используется в качестве синонима точки останова процессора, этот термин может быть вводящим в заблуждение. Существует два основных типа точек останова: точек останова процессора, контролируемых процессором, и точек останова программного обеспечения, контролируемых отладчиком. Точки останова процессора обычно задаются в программных данных. Это причина, по которой они называются "точками останова данных", но их также можно задать в исполняемом коде. Точки останова программного обеспечения обычно задаются в исполняемом коде, но их также можно задать в данных программы. К сожалению, в отладочной литературе часто используются точки останова процессора как "точки останова данных", даже если они заданы в исполняемом коде.

Точки останова процессора

Точка останова процессора активируется при доступе к определенному расположению памяти. Существует четыре типа точек останова процессора, соответствующих типу доступа к памяти, который активирует его:

Тип точки останова Действие
e (execute) Активируется, когда процессор получает инструкцию из указанного адреса.
r (чтение и запись) Активируется, когда процессор считывает или записывает память по указанному адресу.
w (запись) Активируется, когда процессор записывает память по указанному адресу.
i (i/o) Активируется при доступе к порту ввода-вывода по указанному адресу.

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

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

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

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

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

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

Точки останова программного обеспечения

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

Доступность типов точек останова процессора

Параметр i (i/o) доступен только во время отладки в режиме ядра.

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

Ограничения точек останова программного обеспечения и точек останова процессора

Можно указать адрес данных, а не адрес программы при использовании команд bp или bm /a. Однако даже если указано расположение данных, эти команды создают точки останова программного обеспечения, а не точки останова процессора. Когда отладчик помещает точку останова программного обеспечения в некоторое место, она временно заменяет содержимое этого расположения памяти инструкцией останова. Это не повреждает исполняемый образ, так как отладчик запоминает исходное содержимое этого расположения, а при попытке целевого процесса выполнить этот код отладчик может соответствующим образом реагировать. Но если точка останова программного обеспечения устанавливается в расположении данных, результирующая перезапись может привести к повреждению данных. Поэтому установка точки останова программного обеспечения в расположении данных безопасна, только если вы уверены, что это расположение будет использоваться только в качестве исполняемого кода.

Команды bp, bu и bm задают точки останова программного обеспечения, заменив инструкцию процессора инструкцией останова. Поэтому их нельзя использовать в коде только для чтения или любом другом коде, который не может быть перезаписан. Чтобы задать точку останова в таком коде, необходимо использовать ba (Break on Access) с параметром e (execute).

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

Начальная точка останова в процессе пользовательского режима (обычно заданная в главной функции или ее эквиваленте) не может быть точкой останова процессора.

Количество точек останова процессора, поддерживаемых, зависит от архитектуры целевого процессора.

Управление точками останова программного обеспечения и точками останова процессора

Точки останова программного обеспечения можно создавать с помощью команд bp (Set Breakpoint), bm (Set Symbol Breakpoint) и bu (Set Неразрешенная точка останова). Точки останова процессора можно создать с помощью команды ba (Break on Access). Команды, которые отключают, разрешают и изменяют точки останова, применяются ко всем типам точек останова. Команды, отображающие список точек останова, включают все точки останова и указывают тип каждого. Список этих команд см. в разделе "Методы управления точками останова".

В диалоговом окне "Точки останова WinDbg" отображаются все точки останова, указывающие точки останова процессора с нотацией "e", "r", "w" или "i", за которым следует размер блока. Это диалоговое окно можно использовать для изменения любой точки останова. Текстовое поле команды в этом диалоговом окне можно использовать для создания любой точки останова. Если нужно использовать точку останова процессора, начните входные данные с "ba". При установке точки останова с помощью мыши в окне Дизассембли WinDbg или окне источника отладчик создает неразрешенную точку останова программного обеспечения.

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