2

Отладчик имеет смысл, когда вы говорите о интерпретируемой программе, потому что инструкции всегда проходят через интерпретатор для проверки перед выполнением. Но как работает отладчик для скомпилированного приложения? Если инструкции уже выложены в памяти и запущены, как я могу получить уведомление о достижении «точки останова» или о том, что произошло «исключение»?Как отладчики/исключения работают над скомпилированной программой?

+0

При настройке точки останова вы фактически записываете специальный код операции 'int3' в заданную позицию в коде, который будет останавливать выполнение. – Cyclonecode

ответ

2

С помощью оборудования и/или операционной системы.

Большинство современных ЦП имеют несколько регистров отладки, которые могут быть настроены на запуск исключения ЦП при достижении определенного адреса. Они часто также поддерживают точки наблюдения адреса, которые вызывают исключения, когда приложение читает или записывает в указанный адрес или диапазон адресов, и одношаговый, что заставляет процесс выполнять одну команду и выдавать исключение. Эти исключения могут быть захвачены отладчиком, подключенным к программе (см. Ниже).

В качестве альтернативы, некоторые отладчики создают точки останова, временно заменяя инструкцию в точке останова инструкцией прерывания или прерывания (тем самым также заставляя программу повысить исключение ЦП). Как только точка останова ударяется, отладчик заменяет ее исходной инструкцией и выполняет однократную обработку CPU за этой инструкцией, чтобы программа работала нормально.

Что касается исключений, это зависит от системы, над которой вы работаете. В системах UNIX отладчики обычно используют системный вызов ptrace() для присоединения к процессу и получают первый снимок при обработке своих сигналов.

TL; DR - магия низкого уровня.

+0

Это потрясающе. Не знал, что это функция процессора. – sircodesalot

Смежные вопросы