En plus des excellentes informations de @BenVoigt, permettez-moi de faire quelques ajouts:
Un point d'arrêt est défini par le débogueur en remplaçant une valeur de code machine (une instruction ou une partie d'une instruction) dans le processus en cours de débogage avec une instruction de déroutement particulière à l'emplacement dans le code qui correspond à la ligne (source) souhaitée pour la rupture. Cette instruction d'interruption particulière est destinée à être utilisée comme point d'arrêt - le débogueur le sait, tout comme le système d'exploitation.
Lorsque le processus / thread débogué atteint l'instruction d'interruption, cela déclenche le processus décrit par @Ben, qui comprend la moitié d'un échange de contexte qui suspend le thread en cours d'exécution (qui inclut l'enregistrement de son état CPU en mémoire) pour une reprise ultérieure potentielle. Étant donné que cette interruption est une interruption de point d'arrêt, le système d'exploitation maintient le processus en cours de débogage suspendu en utilisant peut-être un mécanisme décrit par @Ben, et notifie et finalement reprend le débogueur.
Le débogueur utilise ensuite les appels système pour accéder à l'état enregistré du processus / thread suspendu en cours de débogage.
Pour exécuter (reprendre) la ligne de code qui s'est cassée (qui a maintenant l'instruction de déroutement particulière), le débogueur restaurera la valeur de code machine d'origine qu'il a écrasée avec l'instruction de déroutement de point d'arrêt, peut-être définir un autre déroutement ailleurs (par exemple, si une seule étape, ou l'utilisateur crée de nouveaux points d'arrêt), et marquez le processus / thread comme exécutable, en utilisant peut-être un mécanisme comme décrit @Ben.
Les détails réels peuvent être plus compliqués, en ce sens que le maintien d'un point d'arrêt de longue durée qui est atteint signifie faire quelque chose comme échanger l'interruption de point d'arrêt pour du code réel afin que la ligne puisse s'exécuter, puis échanger à nouveau le point d'arrêt ...
Ces registres ne sont-ils pas constamment utilisés par d'autres processus du système d'exploitation? comment ne sont-ils pas écrasés?
Comme @Ben le décrit, en utilisant la fonction de suspension / reprise de threads déjà existante (le changement de contexte / échange de multitâche ) qui permet aux processeurs d'être partagés par plusieurs processus / threads en utilisant le découpage temporel.
S'agit-il uniquement d'un instantané du contenu et non de données en direct?
C'est les deux. Étant donné que le thread qui a atteint le point d'arrêt est suspendu, c'est un instantané des données en direct (registres du processeur, etc.) au moment de la suspension, et le maître faisant autorité des valeurs du registre du processeur à restaurer dans le processeur si le thread est repris. . Si vous utilisez l'interface utilisateur du débogueur pour lire et / ou modifier les registres du processeur (du processus en cours de débogage), il lira et / ou modifiera cet instantané / maître à l'aide d'appels système.