Comment un débogueur de travail?
Je continue à me demander comment un débogueur de travail? Particulièrement celle qui peut être "attaché" à déjà en cours d'exécution de l'exécutable. Je comprends que le compilateur traduit le code en langage machine, mais alors comment debugger "savoir" ce que c'est d'être attaché?
- Eli l'article a été déplacé vers eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1
- Cet article est intéressant, mais ne parle que de l'API de niveau d'abstraction pour le débogage sur Linux. Je suppose que l'OP veut en savoir plus à propos de sous le capot.
Vous devez vous connecter pour publier un commentaire.
Les détails de la façon dont un débogueur travaux dépendra de ce que vous déboguez, et 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 laquelle le processus de connecter, par leur nom ou 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 plutôt des événements à venir du système 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 à travers des Api fournies par le système d'exploitation. Voir la liste des les 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 par le biais de la 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 à la
CC
(int3
). C'est fait avecWriteProcessMemory
sur Windows. Lorsque le CPU arrive à cette instruction, et exécute laint3
, 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 le
CC
avec l'octet qui était là à l'origine. Le débogueur jeux deTF
, le Piège Drapeau dansEFLAGS
(en modifiant leCONTEXTE
), et continue le processus. Le Piège de l'Indicateur, le PROCESSEUR pour générer automatiquement une seule étape à l'exception (INT 1
) sur la prochaine instruction.Lorsque le processus en cours de débogage s'arrête la prochaine fois, 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 par tous les débogueurs, 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.
Dans Linux, le débogage d'un processus qui commence avec la ptrace(2) appel système. Cet article a un bon tutoriel sur la façon d'utiliser
ptrace
de mettre en œuvre certaines simple débogage des constructions.(2)
nous dire quelque chose de plus (ou de moins) que "ptrace est un appel système"?(2)
est le numéro de section de manuel. Voir en.wikipedia.org/wiki/Man_page#Manual_sections pour une description des sections du manuel.ptrace
est un appel système.(2)
nous dit que nous pouvons typeman 2 ptrace
et obtenir le droit de man-pas important ici, car il n'y a pas d'autresptrace
pour lever l'ambiguïté, mais pour comparerman printf
avecman 3 printf
sur Linux.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: "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.
Une autre source précieuse pour comprendre le débogage est de CPU Intel manuel (Intel® 64 et IA-32 Architectures
Manuel de développement logiciel). Dans le volume 3 BIS, chapitre 16, il a introduit le support matériel de débogage, tels que des exceptions, et le débogage matériel registres. La suite est à partir de ce chapitre:
T (piège) drapeau, TSS — Génère une exception de débogage (#DB) lors d'une tentative
prise de passer à une tâche avec le T indicateur dans son TSS.
Je ne suis pas sûr que la Fenêtre ou Linux, l'utilisation de ce drapeau ou pas, mais il est très intéressant de lire ce chapitre.
Espère que cela aide quelqu'un.
Ma compréhension est que lorsque vous compilez une application ou un fichier DLL, ce qu'il compile contient des symboles représentant les fonctions et les variables.
Lorsque vous avez une version de débogage, ces symboles sont bien plus détaillés que quand c'est une version validée, permettant ainsi le débogueur pour vous donner plus d'informations. Lorsque vous attacher le débogueur à un processus, il examine les fonctions qui sont actuellement en cours d'accès et résout tous les symboles de débogage à partir d'ici (car il sait que le fonctionnement interne du fichier compilé ressemble, il peut le déduire de ce qui pourrait être dans la mémoire, du contenu de l'ints, des flotteurs, des cordes, etc.). Comme la première affiche dit, cette information et comment ces symboles de travail dépend fortement de l'environnement et de la langue.
Je pense qu'il y a deux principales questions à réponse ici:
1. Comment le débogueur ne connaît qu'une exception s'est produite?
Lorsqu'une exception se produit dans un processus qui est en cours de débogage, le débogueur est notifié par le système d'exploitation avant de tout utilisateur des gestionnaires d'exceptions définies dans le processus cible sont donné une chance de répondre à l'exception. Si le débogueur choisit de ne pas traiter cette (première chance) notification d'exception, à l'exception d'envoi de la séquence de poursuivre et de le thread cible est ensuite donné une chance de traiter l'exception, si il veut le faire. Si le SEH exception n'est pas gérée par le processus cible, le débogueur est alors envoyé un autre debug événement, appelé une seconde chance de notification, afin de l'informer qu'une exception non gérée s'est produite dans le processus cible. Source
2. Comment le débogueur sait comment arrêter sur un point d'arrêt?
Simplifié réponse est: Quand vous mettez un point de rupture dans le programme, le débogueur remplace votre code à ce point avec un int3 de l'instruction qui est un interruption logicielle. Comme un effet, le programme est suspendu et le débogueur est appelé.