Подтвердить что ты не робот

Как отладчики гарантируют правильность при использовании контрольной точки программного обеспечения INT 3 (0xCC), хотя инструкция была исправлена?

Я читал, что INT 3 (0xCC) используется для контрольных точек программного обеспечения.

Он устанавливается (например) отладчиком, перезаписывая фактический программный код в памяти.

Я также прочитал, что INT 3 является "ловушкой", а не "ошибкой", означающей, что адрес, нажатый в стек, является адресом инструкции, следующей за инструкцией INT3.

Как отладчик гарантирует правильность, если исправленная команда не была повторно выполнена?

4b9b3361

Ответ 1

Если вы хотите продолжить выполнение после срабатывания точки останова, у вас есть две возможности: либо точка останова должна была срабатывать только один раз, либо она должна была быть постоянной. Если он должен был только один раз выстрелить, вы восстановите исходное значение, которое вы перезаписали с помощью инструкции точки останова, вручную настройте адрес на адрес этой команды (помните, независимо от того, какая инструкция была там, какова была ваша однобайтовая точка останова, поэтому настройка всегда тривиальна). Затем вы продолжаете выполнение.

Если предполагается, что это постоянная точка останова, добавляется морщина: перед продолжением выполнения вы устанавливаете бит одного шага (aka trap) в флагах в стеке. Это означает, что будет выполняться только одна команда, в которой была установлена ​​точка останова, и вы снова получите прерывание прерывания. Вы ответите на это, восстановив байт int 3, который вы только что установили в первый байт исходной команды, и (снова) продолжите выполнение.

Ответ 2

Прошло некоторое время с тех пор, как я углубился в такие вещи, но, полагая, что вы правы, что в стек попадает следующий адрес, отладчик может вытолкнуть обратный адрес и использовать его, чтобы выяснить, где была точка останова (обратный адрес минус один, так как команда INT 3 имеет длину один байт) [отредактировано].

Другими словами, отладчик не обязательно должен возвращаться к адресу в стеке. Он может восстановить исходную инструкцию, а затем выполнить ее в исходном месте. Если точка останова должна оставаться установленной, она может использовать "бит ловушки" в флажках для выполнения только одной команды - первоначальной, которая была перезаписана, - до того, как будет создана другая ловушка (опять я думаю, что INT 3); то команда INT 3 может быть восстановлена, прежде чем продолжить выполнение.

В большинстве случаев отладчики работают в системе, где они не работают напрямую с ловушкой; они могут получить сигнал, например, сообщая им, где произошла ловушка. Скорее всего, им по-прежнему нужно выяснить "реальный" адрес (т.е. Адрес инструкции INT 3) из адреса ловушки, поскольку ОС не имеет возможности это сделать.

Все становится слишком сложным, если задействовано несколько потоков; в этом случае восстановление исходной команды "на месте" может привести к тому, что точка останова будет пропущена, если она будет удалена другим потоком. Одно из решений может остановить все остальные потоки, прежде чем восстанавливать инструкцию (и снова запускать их позже).

Ответ 3

Обычное решение для отладчика изменить адрес в стеке (и восстановить команду, которая была перезаписана ловушкой), поэтому она выполняет исправленную команду.