В дополнение к замечательной информации @BenVoigt, позвольте мне сделать некоторые дополнения:
Точка останова устанавливается отладчиком путем замены значения машинного кода (инструкции или части инструкции) в отлаживаемом процессе на конкретную команду прерывания в месте в коде, которое соответствует желаемой (исходной) строке, для которой необходимо выполнить разрыв. Эта конкретная команда прерывания предназначена для использования в качестве точки останова - отладчик это знает, как и операционная система.
Когда отлаживаемый процесс / поток сталкивается с инструкцией прерывания, это запускает процесс, который описывает @Ben, который включает половину контекстного обмена, который приостанавливает текущий запущенный поток (который включает в себя сохранение его состояния ЦП в памяти) для возможного последующего возобновления. Так как эта ловушка является ловушкой точки останова, операционная система удерживает отлаживаемый процесс приостановленным, используя, возможно, механизм, описанный @Ben, и уведомляет и в конечном итоге возобновляет работу отладчика.
Затем отладчик использует системные вызовы для доступа к сохраненному состоянию отлаживаемого приостановленного процесса / потока.
Чтобы выполнить (возобновить) строку кода, которая прервалась (которая теперь имеет конкретную инструкцию прерывания), отладчик восстановит исходное значение машинного кода, которое было перезаписано инструкцией прерывания точки останова, возможно, установит другое прерывание где-нибудь еще (например, если пошаговое выполнение, или пользователь устанавливает новые точки останова) и помечает процесс / поток как работоспособный, возможно, используя механизм, описанный @Ben.
Фактические детали могут быть более сложными, так как сохранение длительной точки останова, для которой была достигнута ошибка, означает что-то вроде замены ловушки точки останова для реального кода, чтобы можно было запустить строку, а затем снова вернуть точку прерывания обратно ...
Разве эти регистры не используются другими процессами ОС постоянно? как они не перезаписываются?
Как описывает @Ben, использование уже существующей функции приостановки / возобновления потока (переключение контекста / переключение многозадачности ), которая позволяет процессорам совместно использоваться несколькими процессами / потоками, используя квантование времени.
Это только снимок контента, а не живые данные?
Это оба. Поскольку поток , который попал в точку останова приостанавливается, это снимок из данных в реальном времени (регистры процессора, и т.д ..) в момент приостановки и авторитетный мастер значений регистров процессора для восстановления в процессор Должен ли быть поточно возобновленной , Если вы используете пользовательский интерфейс отладчика для чтения и / или изменения регистров ЦП (отлаживаемого процесса), он будет считывать и / или изменять этот снимок / мастер с помощью системных вызовов.