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


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

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

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

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

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

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

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

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

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

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

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

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

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

kd> bp /t @$thread nt!ntopenfile

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

Список автоматических псевдорегистров см. в разделе Синтаксис псевдорегистрирующих регистров.

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

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

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

Например, если вы хотите выполнять, пока регистр 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 (установка точки останова)

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

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