На додаток до чудової інформації від @BenVoigt, дозвольте мені внести деякі доповнення:
Точка розриву встановлюється налагоджувачем шляхом заміни значення машинного коду (інструкція або частина інструкції) у процесі налагодження на певну інструкцію пастки у місці в коді, що відповідає бажаному рядку (джерела), на який потрібно перерватися. Ця конкретна інструкція щодо пастки призначена для використання в якості точки перерви - відладчик це знає, як і операційна система.
Коли налагоджений процес / потік потрапляє на інструкцію про пастку, це запускає процес @Ben описує, що включає половину контекстної заміни, яка призупиняє поточний поточний потік (що включає збереження його стану CPU в пам'яті) для можливого подальшого відновлення. Оскільки ця пастка є ловушкою точки перерви, операційна система зберігає процес налагодження призупинення, використовуючи, можливо, механізм @Ben описує, та повідомляє і врешті-решт відновлює відладчик.
Тоді відладчик використовує системні виклики, щоб отримати доступ до збереженого стану відключеного призупиненого процесу / потоку.
Щоб виконати (відновити) рядок коду, який порушився (який тепер має конкретну інструкцію щодо пастки), налагоджувач відновить початкове значення машинного коду, яке він перезаписав, з інструкцією щодо лову точки переривання, можливо, встановить іншу пастку десь в іншому місці (наприклад, якщо один крок, або користувач робить нові точки перерви) і позначте процес / потік як запущений, можливо, використовуючи механізм, як описано @Ben.
Фактичні деталі можуть бути складнішими, оскільки тримати довгу точку розриву, яка потрапила, означає зробити щось на кшталт заміни пастки точки перерви на справжній код, щоб ця лінія могла працювати, а потім знову міняти точку розриву ...
Чи не постійно такі регістри використовуються іншими процесами ОС? як їх не перезаписати?
Як описано @Ben, використовуючи вже існуючу функцію призупинення / відновлення потоку (контекстна комутація / заміна багатозадачності ), яка дозволяє обмінюватися процесорами на декілька процесів / потоків, використовуючи зрізання часу.
Це лише знімок вмісту, а не живі дані?
Це і те, і інше. Оскільки потік , який потрапив в точку зупину призупиняється, це знімок з даних в реальному часі (регістри процесора, і т.д ..) в момент припинення і авторитетний майстер значень регістрів процесора для відновлення в процесор повинен бути поточно відновленої . Якщо ви користуєтесь інтерфейсом користувача налагоджувача для читання та / або зміни регістрів процесора (процесу налагодження), він зчитує та / або змінить цей знімок / майстер за допомогою системних викликів.