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


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

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

  • GetId возвращает идентификатор точки останова.

  • GetType возвращает тип точки останова (программное обеспечение или процессор) и тип действующего процессора, для которого задана точка останова.

  • GetAdder возвращает клиент, который добавил точку останова.

  • GetOffset возвращает адрес точки останова.

  • GetOffsetExpression возвращает строку выражения, указывающую расположение точки останова.

В дополнение к расположению и типу точки останова точка останова имеет несколько параметров, управляющих ее поведением.

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

Флаги точек останова

Флаги точек останова — это один из видов параметров точки останова.

Флаги точек останова можно запрашивать с помощью GetFlags. Их можно изменить с помощью команд AddFlags, RemoveFlags или SetFlags.

Флаги точки останова образуют битовое поле. Возможные флаги, которые можно использовать в этом битовом поле, и их значения:

DEBUG_BREAKPOINT_ENABLED
Если этот флаг установлен, точка останова включена и будет иметь обычный эффект. Если этот флаг не установлен, точка останова отключена и не будет иметь никакого эффекта. Если вы хотите временно отключить точку останова, можно удалить этот флаг; Затем можно легко добавить этот флаг, если вы хотите повторно включить эту точку останова.

DEBUG_BREAKPOINT_ADDER_ONLY
Если этот флаг установлен, точка останова является частной точкой останова. Эта точка останова видна только тому клиенту, который ее добавил. В этом случае другие клиенты не смогут запрашивать у обработчика точку останова, и подсистема не будет отправлять события, созданные точкой останова, другим клиентам. Все обратные вызовы (события и выходные данные), связанные с этой точкой останова, будут отправляться только этому клиенту. См. раздел GetAdder.

DEBUG_BREAKPOINT_GO_ONLY
Если этот флаг установлен, точка останова будет активирована только в том случае, если целевой объект находится в неограниченном выполнении. Она не будет активирована, если подсистема выполняет инструкции в целевом объекте.

DEBUG_BREAKPOINT_ONE_SHOT
Если этот флаг установлен, точка останова автоматически удаляется при первом запуске.

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

Другие параметры точки останова

Параметры точки останова также включают:

Количество проходов
Если с точкой останова связано количество проходов, она не будет активирована, пока целевой объект не пройдет точку останова указанное количество раз. Число проходов, которое было изначально задано, можно найти с помощью GetPassCount. Количество оставшихся раз, когда подсистема будет проходить точку останова перед активацией, можно найти с помощью GetCurrentPassCount. Число проходов можно сбросить до нового значения с помощью SetPassCount.

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

Команды
С точкой останова может быть связана команда. Команда выполняется при активации точки останова. Эту команду можно найти с помощью getCommand и изменить с помощью SetCommand.

Размер
Если точка останова является точкой останова процессора, она должна иметь указанный размер. Это определяет размер блока памяти, доступ к которому активирует точку останова. В начале блока находится точка останова. Размер можно найти с помощью GetDataParameters и изменить с помощью SetDataParameters.

Тип доступа
Если точка останова является точкой останова процессора, она должна иметь тип доступа. Это определяет тип доступа, который активирует точку останова. Например, точка останова может быть активирована, если целевой объект считывает, записывает или выполняет память, заданную точкой останова. Тип доступа можно найти с помощью GetDataParameters и изменить с помощью SetDataParameters.

Допустимые параметры для точек останова процессора

Для точек останова процессора доступны следующие типы доступа:

Значение Описание

DEBUG_BREAK_READ

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

DEBUG_BREAK_WRITE

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

DEBUG_BREAK_READ | DEBUG_BREAK_WRITE

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

DEBUG_BREAK_EXECUTE

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

DEBUG_BREAK_IO

Точка останова будет активирована при доступе к порту ввода-вывода в блоке памяти точек останова. (Только Windows XP и Microsoft Windows Server 2003, только режим ядра, только x86)

Не все типы и размеры доступа поддерживаются на всех процессорах. Поддерживаются следующие типы и размеры доступа:

x86
Поддерживаются все типы доступа. DEBUG_BREAK_READ ведет себя так же, как DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Размер должен быть 1, 2 или 4. Адрес точки останова должен быть кратным размеру.

x64
Поддерживаются все типы доступа. DEBUG_BREAK_READ ведет себя так же, как DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Размер должен быть 1, 2, 4 или 8. Адрес точки останова должен быть кратным размеру.