Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Существует несколько способов вызвать выполнение целевого объекта до достижения указанного состояния.
Использование точки останова для управления выполнением
Один из способов — использовать точку останова. Самая простая точка останова останавливает выполнение, когда счетчик программы достигает указанного адреса. Более сложная точка останова может:
должен срабатывать только в том случае, если этот адрес выполняется определенным потоком,
разрешите указанное число проходов по этому адресу перед активацией.
автоматически выдает указанную команду при активации или
просмотрите указанный адрес в неисполнимой памяти, активируемой при чтении или записи в неисполнимую память.
Дополнительные сведения о настройке и управлении точками останова см. в разделе "Использование точек останова".
Более сложный способ выполнения до достижения указанного состояния — использовать условную точку останова. Эта точка останова устанавливается по определенному адресу, но активируется только в том случае, если выполнено указанное условие. Дополнительные сведения см. в разделе "Настройка условной точки останова".
Точки останова и 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 (Установка точки останова)