Ниже приведены некоторые цитаты из Руководства разработчика программного обеспечения Intel Vol. 3B, глава 17:
Архитектура Intel 64 и IA-32 выделяет два прерывания
векторы для обработки исключений отладки: вектор 1 ( отладка исключение,
#DB) и вектор 3 ( точка останова исключение, #BP).
Для исключения :
Обработчик debug-exception обычно является программой отладчика или частью
большая система программного обеспечения. Процессор генерирует исключение отладки для
любое из нескольких условий . Отладчик проверяет флаги в регистрах DR6 и DR7, чтобы определить, какое условие вызвало исключение
и какие другие условия могут применяться.
Для точки останова исключение:
Исключение точка останова (прерывание 3) вызвано выполнением
INT 3 инструкция. Отладчики используют исключения точек останова ... как
механизм приостановки выполнения программы для проверки регистров и
ячейки памяти.
С процессорами Intel386 и более поздними версиями IA-32 удобнее
установить точки останова с помощью регистров адреса точки останова (от DR0 до
DR3). Однако исключение точки останова все еще полезно для
отладчики точек останова, потому что исключение точки останова может вызвать
отдельный обработчик исключений. Исключение точки останова также полезно
когда необходимо установить больше точек останова, чем отладки
регистры или когда точки останова помещаются в исходный код
программа в разработке.
Итак, мы видим, что исключение точки останова позволяет вам приостановить выполнение программы, а исключение отладки проверяет несколько условий и обрабатывает их по-разному.
Только за исключением отладки, вы не сможете разбить местоположение, которое вы хотите. Только после того, как вы сломаете в каком-то месте, вы можете , а затем настроить процессор для одношаговых или других операций, которые используются исключением отладки.
INT 3 - это однобайтовый код операции. Таким образом, он может перезаписать любую существующую инструкцию с управляемым побочным эффектом, чтобы прервать выполнение текущей программы. Без этого, как вы могли бы иметь возможность установить одноступенчатый флаг в EFLAGS на соответствующее время без побочных эффектов?
Таким образом, необходим двухшаговый механизм break-and-then-debug .
Весь поток:
Сначала подключите отладчик в качестве обработчика к и int 1 (#DB) и int 3 (#BP).
Затем поместите int3 туда, где вы хотите взломать. Затем отладчик может вмешаться.
Как только отладчик начинает обрабатывать int3 (#BP), если вы хотите пошаговое выполнение, скажите отладчику установить флаг прерывания (TF) в EFLAGS. Затем CPU будет генерировать int 1 (#DB) после каждой отдельной инструкции. Так как отладчик также подключен к int 1 (#DB), у него также будет возможность подключиться.
ДОБАВИТЬ 1 - 5:55 вечера 5/31/2019
(Я обсуждал с одним из моих друзей, как работает отладчик. Он писал отладчик раньше.)
Кажется, INT 3 (#BP) - самый важный. Вы можете явно разместить инструкцию INT 3
в том месте, в которое хотите взломать. Или вы можете позволить отладчику сделать это за вас.
После нажатия INT 3
ЦПУ сохранит контекст неработающей программы и переключится на обработчик INT 3
, который обычно является частью отладчика. Теперь сломанная программа приостановлена. Отладчик - это обычная Windows или любое другое настольное приложение. Он может использовать обычную настольную петлю сообщений для ожидания пользовательских команд, чтобы решить, как обращаться с отлаживаемой программой. Так что, похоже, и отладчик, и отладчик сейчас ждут. Но причины очень разные.
Затем отладчик может проверить сохраненный контекст отладчика.Или он может просто восстановить сохраненный контекст дебютанта и позволить ему возобновить.Или он может установить флаг TF
в EFLAGS, чтобы процессор генерировал #DB
после каждой инструкции.
Но часто , пользователи могутне хочу пошагово на уровне инструкции .Они могут захотеть отладить на уровне операторов C , который может быть , состоящим из множества команд.Таким образом, отладчик может использовать отладочную информацию, такую как файл PDB, для поиска информации о местоположении.Если пользователи хотят выполнить один шаг на уровне оператора C, отладчик может найти начальную инструкцию следующего оператора C и перезаписать 1-й байт этого символа INT 3
.А потом все начинается сначала.