Je me demande comment fonctionne un débogueur ? Particulièrement celle qui peut être « attaché » déjà en cours d’exécution exécutable. Je comprends que ce compilateur traduit le code de langage machine, mais alors comment débogueur does « sais » ce qui c’est qui y sont attaché ?
Réponses
Trop de publicités?Les détails de la façon dont un débogueur travaux dépendra de ce que votre sont de débogage, et de ce que l'OS est. Pour le débogage natif sur windows, vous pouvez trouver quelques détails sur MSDN: Win32 API de Débogage
L'utilisateur indique le débogueur processus à joindre, soit par son nom ou par id de processus. Si c'est un nom, puis le debugger va chercher l'id de processus, et de lancer la session de débogage via un appel système, sous Windows ce serait DebugActiveProcess.
Une fois fixé le débogueur vont entrer dans une boucle d'événements comme beaucoup pour toute l'INTERFACE utilisateur, mais au lieu d'événements venant des systèmes de fenêtrage, le système d'exploitation de générer des événements en fonction de ce qui se passe dans le processus en cours de débogage, par exemple une exception se produise. Voir WaitForDebugEvent.
Le débogueur est en mesure de lire et d'écrire la cible du processus de la mémoire virtuelle, et même ajuster son registre des valeurs par le biais de l'API fournie par le système d'exploitation. Voir la liste des fonctions de débogage pour windows.
Le débogueur est capable d'utiliser des informations à partir de fichiers de symboles de traduire à partir d'adresses pour les noms de variables et les lieux dans le code source. Le fichier de symboles d'information est un ensemble distinct de l'Api et n'est pas une partie intégrante de l'OS en tant que tel. Sur windows c'est à travers le Débogage de l'Interface Access SDK.
Si vous déboguez une gestion de l'environnement (.NET, Java, etc), le processus sera généralement similaire, mais les détails sont différents, comme l'environnement de la machine virtuelle fournit l'API de débogage plutôt que de l'OS sous-jacent.
Ce que je comprends:
Pour logiciel des points d'arrêt sur x86, le débogueur remplace le premier octet de l'instruction d' CC
(int3
). Lorsque le CPU arrive à cette instruction, et exécute l' int3
, ce qui provoque la CPU pour générer une exception de débogage. Le système d'exploitation reçoit cette interruption, se rend compte que le processus est en cours de débogage, et en informe le débogueur processus que le point d'arrêt a été frappé.
Après le point d'arrêt est atteint, et le processus est arrêté, le débogueur regarde dans sa liste des points d'arrêt, et remplace l' CC
avec l'octet qui était là à l'origine. Le débogueur définit le Piège Drapeau (via des appels de l'API), et continue le processus. Le Piège de l'Indicateur, le PROCESSEUR pour générer automatiquement une exception de débogage sur la prochaine instruction.
Lorsque le debugee processus s'arrête à nouveau, à nouveau le débogueur remplace le premier octet du point d'arrêt de l'enseignement, avec CC
, et le processus continue.
Je ne suis pas sûr si ce est exactement la façon dont il est mis en œuvre, mais j'ai écrit un programme Win32 gère pour déboguer lui-même à l'aide de ce mécanisme. Complètement inutile, mais d'éducation.
Sous Linux, déboguer un processus commence par l’appel système ptrace(2) . Cet article a un bon tutoriel sur comment utiliser `` pour mettre en œuvre certaines constructions de débogage simples.
Voici une série d’articles que j’ai écrit pour répondre à cette question. Si tout va bien, il sera utile aux autres.
Si vous êtes sur un système d'exploitation Windows, une grande ressource pour ce serait "le Débogage des Applications pour Microsoft .NET et Microsoft Windows" par John Robbins:
(ou même l'ancienne édition: "le Débogage des Applications")
Le livre a un chapitre sur la façon dont un débogueur œuvres qui inclut le code pour un couple de simples (mais de travail) débogueurs.
Depuis que je ne suis pas familier avec les détails de Unix/Linux de débogage, ce genre de choses peuvent ne pas s'appliquer à tous les autres OS. Mais je suppose que comme une introduction à un sujet très complexe, les concepts - si ce n'est les détails et les Api - devrait 'port' à la plupart n'importe quel OS.