# #debugging #x86-64 #windbg
Вопрос:
Команда windbg tct выполняет программу до тех пор, пока она не достигнет call
инструкции или ret
инструкции. Мне интересно, как отладчик реализует эту функциональность под капотом.
Я мог бы представить, что отладчик сканирует инструкции из текущих инструкций для следующего call
или ret
и устанавливает соответствующие точки останова в найденных инструкциях. Однако я думаю, что это маловероятно, потому что он также должен был бы учитывать jmp
инструкции, чтобы было произвольное количество возможных call
или ret
инструкций, в которых необходимо было бы установить такую точку останова.
С другой стороны, мне интересно, предоставляет ли процессор x86/x64 функциональность, которая вызывает исключение, которое отладчик будет перехватывать всякий раз, когда процессор собирается обработать call
ret
инструкцию или. Тем не менее, я не слышал о такой функциональности.
Ответ №1:
Я бы предположил, что это повторяется несколько раз, пока следующая инструкция не будет вызовом или повторением, вместо того, чтобы пытаться выяснить, где установить точку останова. (Что в общем случае может быть так же сложно, как решить проблему остановки.)
Возможно, это можно оптимизировать, сканируя вперед по «прямолинейному» коду и устанавливая точку останова в следующей jmp
/ jcc
/ loop
или другой инструкции по передаче управления (например xabort
), а также улавливая сигналы/исключения, которые могут передавать управление обработчику SEH.
Я также не знаю о какой-либо поддержке HW для взлома определенного типа инструкций или кода операции: отладочные регистры x86 DR0..7 позволяют аппаратным точкам останова по адресам кода без перезаписи машинного кода int3
, а также аппаратным точкам наблюдения (для отслеживания загрузки/хранения данных по определенному адресу или диапазону адресов). Но не фильтрация по коду операции.
Комментарии:
1. Элемент управления BTF в MSR IA32_DEBUGCTL вызывает одношаговый перерыв в каждой инструкции по передаче управления.
2. @prl: О, здорово, звучит так, как будто он был разработан именно для такого рода целей, чтобы ускорить выполнение прямолинейного кода, все еще делая один шаг. xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/… извлекает страницу из тома 3, в которой она описана.