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


Выполнение до достижения указанного состояния

Существует несколько способов вызвать выполнение целевого объекта до достижения указанного состояния.

Использование точки останова для управления выполнением

Один из способов — использовать точку останова. Самая простая точка останова останавливает выполнение, когда счетчик программы достигает указанного адреса. Более сложная точка останова может:

  • должен срабатывать только в том случае, если этот адрес выполняется определенным потоком,

  • разрешите указанное число проходов по этому адресу перед активацией.

  • автоматически выдает указанную команду при активации или

  • просмотрите указанный адрес в неисполнимой памяти, активируемой при чтении или записи в неисполнимую память.

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

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

Точки останова и Pseudo-Registers

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

Например, в следующей точке останова используется псевдорегистр $thread, который всегда равен значению текущего потока. Он определяет значение текущего потока при его использовании в команде. Используя $thread в качестве аргумента команды / t команды bp (Set Breakpoint), можно создать точку останова, которая будет запускаться каждый раз, когда NtOpenFile вызывается потоком, который был активен в то время, когда вы выпустили команду BP :

kd> bp /t @$thread nt!ntopenfile

Эта точка останова не будет активирована, когда любой другой поток вызывает NtOpenFile.

Список автоматических псевдорегистров см. в Pseudo-Register синтаксисе.

Использование файла скрипта для управления выполнением

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

Как правило, этот файл скрипта будет содержать маркеры .if и .else . Для выполнения одного шага можно использовать команду , например t (Трассировка), а затем проверить условие в вопросе.

Например, если вы хотите выполнять программу до тех пор, пока регистр eax не будет содержать значение 0x1234, можно создать файл скрипта с именем eaxstep, содержащий следующую строку:

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

Затем выполните следующую команду из командного окна отладчика:

t "$<eaxstep"

Эта команда t выполнит один шаг, а затем выполнит указанную команду. Эта команда выполняется в $ < (файл скрипта запуска), который запускает файл eaxstep. Файл скрипта проверяет значение eax, выполняет команду t , а затем вызывает себя рекурсивно. Это продолжается до тех пор, пока регистр eax не равен 0x1234, в какой момент команда echo (Echo Comment) выводит сообщение в окно команды отладчика и останавливает выполнение.

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

Неоднозначность в решении точек останова

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

См. также

использование точек останова

Синтаксис точки останова

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

Неоднозначное разрешение брейкпоинтов

Неразрешенные точки останова (бу точки останова)