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