Gestatten Sie mir zusätzlich zu den großartigen Informationen von @BenVoigt einige Ergänzungen:
Ein Haltepunkt wird vom Debugger gesetzt, indem ein Maschinencodewert (ein Befehl oder ein Teil eines Befehls) im zu debuggenden Prozess durch einen bestimmten Trap-Befehl an der Stelle im Code ersetzt wird, an der die gewünschte (Quell-) Zeile unterbrochen werden soll. Dieser spezielle Trap-Befehl ist als Haltepunkt gedacht - der Debugger weiß das und das Betriebssystem auch.
Wenn der zu debuggende Prozess / Thread auf den Trap-Befehl trifft, der den Prozess @Ben auslöst, wird beschrieben, welcher die Hälfte eines Context-Swaps enthält, der den aktuell ausgeführten Thread anhält (einschließlich des Speicherns seines CPU-Status im Speicher), um ihn möglicherweise später wiederaufzunehmen. Da es sich bei diesem Trap um einen Haltepunkt handelt, hält das Betriebssystem den zu debuggenden Prozess möglicherweise mithilfe eines von @Ben beschriebenen Mechanismus angehalten und benachrichtigt den Debugger und setzt ihn schließlich fort.
Der Debugger verwendet dann Systemaufrufe, um auf den gespeicherten Status des angehaltenen Prozesses / Threads zuzugreifen, der debuggt wird.
Um die unterbrochene Codezeile (die jetzt den speziellen Trap-Befehl enthält) auszuführen (fortzusetzen), stellt der Debugger den ursprünglichen Maschinencode-Wert wieder her, den er mit dem Breakpoint-Trap-Befehl überschrieben hat. oder der Benutzer erstellt neue Haltepunkte) und markiert den Prozess / Thread als ausführbar, möglicherweise unter Verwendung eines Mechanismus, wie er von @Ben beschrieben wird.
Tatsächliche Details können komplizierter sein, da das Beibehalten eines langen Haltepunkts, der getroffen wird, das Austauschen der Haltepunktfalle gegen echten Code bedeutet, damit die Zeile ausgeführt werden kann, und das erneute Eintauschen des Haltepunkts ...
Werden diese Register nicht ständig von anderen Betriebssystemprozessen verwendet? Wie werden sie nicht überschrieben?
Wie @Ben beschreibt, können mit der bereits vorhandenen Funktion zum Anhalten / Fortsetzen von Threads (Kontextwechsel / Austauschen von Multitasking ) Prozessoren von mehreren Prozessen / Threads mithilfe von Time Slicing gemeinsam genutzt werden.
Ist es nur ein Schnappschuss des Inhalts und keine Live-Daten?
Es ist beides. Da der Thread, der den Haltepunkt erreicht hat, angehalten wird, handelt es sich um eine Momentaufnahme der Live-Daten (CPU-Register usw.) zum Zeitpunkt des Anhaltens und des autorisierenden Masters der CPU-Registerwerte, die im Prozessor wiederhergestellt werden sollen, falls der Thread wieder aufgenommen wird . Wenn Sie die Benutzeroberfläche des Debuggers zum Lesen und / oder Ändern der CPU-Register (des zu debuggenden Prozesses) verwenden, wird dieser Snapshot / Master mithilfe von Systemaufrufen gelesen und / oder geändert.