Oltre alle ottime informazioni di @BenVoigt, permettimi di fare alcune aggiunte:
Il debugger imposta un punto di interruzione sostituendo un valore del codice macchina (un'istruzione o parte di un'istruzione) nel processo in fase di debug con una particolare istruzione trap nella posizione nel codice che corrisponde alla riga (sorgente) desiderata in cui interrompere. Questa particolare istruzione trap è pensata per essere utilizzata come breakpoint: il debugger lo sa e anche il sistema operativo.
Quando il processo / thread in fase di debug colpisce l'istruzione trap, ciò innesca il processo descritto da @Ben, che include la metà di uno scambio di contesto che sospende il thread attualmente in esecuzione (che include il salvataggio dello stato della CPU in memoria) per una potenziale ripresa successiva. Poiché questa trap è una trap breakpoint, il sistema operativo mantiene sospeso il processo in fase di debug usando forse un meccanismo descritto da @Ben e avvisa e infine ripristina il debugger.
Il debugger utilizza quindi le chiamate di sistema per accedere allo stato salvato del processo / thread sospeso in fase di debug.
Per eseguire (riprendere) la riga di codice interrotta (che ora ha la particolare istruzione trap), il debugger ripristinerà il valore del codice macchina originale che ha sovrascritto con l'istruzione trap punto di interruzione, eventualmente impostare un'altra trap da qualche altra parte (ad es. oppure l'utente crea nuovi punti di interruzione) e contrassegna il processo / thread come eseguibile, magari utilizzando un meccanismo come descritto da @Ben.
I dettagli effettivi possono essere più complicati, in quanto mantenere un breakpoint di lunga durata che viene colpito significa fare qualcosa come scambiare la trappola del breakpoint con codice reale in modo che la linea possa essere eseguita, quindi ricambiare nuovamente il breakpoint ...
Quei registri non sono costantemente utilizzati da altri processi del sistema operativo? come non vengono sovrascritti?
Come descritto da @Ben, utilizzando la funzione di sospensione / ripresa del thread già esistente (il cambio di contesto / scambio di multitasking ) che consente ai processori di essere condivisi da più processi / thread utilizzando la suddivisione del tempo.
È solo un'istantanea del contenuto e non dei dati in tempo reale?
È entrambi. Poiché il thread che ha raggiunto il punto di interruzione è sospeso, è un'istantanea dei dati live (registri CPU, ecc.) Al momento della sospensione e il master autorevole dei valori del registro CPU da ripristinare nel processore nel caso in cui il thread dovesse essere ripreso . Se si utilizza l'interfaccia utente del debugger per leggere e / o modificare i registri della CPU (del processo in fase di debug) leggerà e / o modificherà questa istantanea / master utilizzando le chiamate di sistema.