91 votes

Comment fonctionne le débogage inversé?

GDB a une nouvelle version qui prend en charge le débogage inversé (voir http://www.gnu.org/software/gdb/news/reversible.html ). Je me suis demandé comment ça marche.

Pour que le débogage inversé fonctionne, il me semble que vous devez stocker l’état complet de la machine, mémoire comprise, à chaque étape. Cela rendrait les performances incroyablement lentes, sans parler de l'utilisation de beaucoup de mémoire. Comment ces problèmes sont-ils résolus?

139voto

Michael Snyder Points 2457

Je suis un gdb responsable et l'un des auteurs de la nouvelle inverse de débogage. Je serais heureux de parler de la façon dont il fonctionne. Comme plusieurs personnes ont spéculé, vous avez besoin d'économiser suffisamment d'état de la machine que vous pouvez les restaurer plus tard. Il y a un certain nombre de programmes, dont l'un est tout simplement de sauver les registres ou les emplacements de mémoire qui sont modifiés par chaque instruction machine. Ensuite, pour "annuler" cette instruction, vous venez de rétablir les données dans les registres ou les emplacements de la mémoire.

Oui, c'est cher, mais les processeurs modernes sont si rapides que lorsque vous êtes interactive de toute façon (pas à pas ou des points d'arrêt), vous n'avez pas vraiment d'avis que beaucoup.

13voto

jakobengblom2 Points 2873

Notez que vous ne devez pas oublier l'utilisation de simulateurs, les machines et le matériel, les enregistreurs de mettre en œuvre inverse de l'exécution.

Une autre solution pour la mettre en œuvre est de suivre la trace d'exécution sur le matériel physique, comme c'est le cas par GreenHills et Lauterbach dans leur matériel de base de débogueurs. Sur cette base fixe trace de l'action de chaque instruction, vous pouvez alors passer à n'importe quel point de la trace en supprimant les effets de chaque instruction à son tour. Notez que cela suppose que vous pouvez suivre toutes les choses qui affectent l'état visible dans le débogueur.

Un autre moyen est d'utiliser un point de contrôle + ré-exécution de la méthode, qui est utilisée par VmWare Workstation 6.5 et Virtutech Simics 3.0 (ou version ultérieure), et qui semble être à venir avec Visual Studio 2010. Ici, vous utilisez une machine virtuelle ou un simulateur d'obtenir un niveau d'indirection sur l'exécution d'un système. Vous régulièrement dump l'ensemble de l'état du disque ou de mémoire, puis appuyer sur le simulateur d'être en mesure de la conception déterministe de la ré-exécuter le même programme et chemin d'accès.

Simplifié, il fonctionne comme ceci: dire que vous êtes à l'instant T dans l'exécution d'un système. Pour aller à l'instant T-1, vous de ramasser du point de contrôle du point t < T, puis sur exécuter (T-t-1) cycles pour la fin d'un cycle avant de l'endroit où vous étiez. Cela peut être fait pour fonctionner très bien, et à appliquer, même pour les charges de travail qui ne d'e / s disque, composé au niveau du noyau de code, et effectue le pilote de périphérique de travail. La clé est d'avoir un simulateur qui contient l'ensemble du système cible, avec tous ses processeurs, périphériques, des souvenirs, et IOs. Voir le gdb liste de diffusion et à la discussion suivante que sur le gdb liste de diffusion pour plus de détails. J'utilise cette approche moi-même assez régulièrement pour déboguer difficile de code, en particulier dans les pilotes de périphérique et au début de l'OS démarre.

Une autre source d'information est un Virtutech livre blanc sur la vérification (qui je l'ai écrit, la divulgation complète).

9voto

Michael Snyder Points 2457

Il existe maintenant un tutoriel pour vous aider à démarrer avec le débogage inverse de gdb-7.0: http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial Bonne chance!

9voto

Bananeweizen Points 12524

Au cours d'une EclipseCon séance, nous avons également demandé comment ils le font avec la Chronon Débogueur Java. Que l'on ne vous permet pas de réellement pas en arrière, mais peut lire un programme enregistré d'exécution de telle manière qu'il se sent comme inverse de débogage. (La principale différence est que vous ne pouvez pas modifier le programme en cours d'exécution dans le Chronon débogueur, tandis que vous pouvez le faire dans la plupart des autres Java débogueurs.)

Si j'ai bien compris, il manipule le byte code du programme en cours, de sorte que chaque changement de l'état interne de l'émission est enregistrée. Externe des états n'ont pas besoin d'être enregistrées en outre. Si elles influencer votre programme, d'une certaine façon, alors vous devez avoir une variable interne correspondant à celle extérieure de l'état (et donc que la variable interne est assez).

Lors de la lecture du temps, ils peuvent alors essentiellement à recréer à chaque état de l'exécution du programme à partir de l'enregistrement des changements d'état.

Il est intéressant de noter les changements d'état sont beaucoup plus petits que l'on pourrait attendre sur le premier regard. Donc, si vous avez une condition "si", on pourrait penser que vous avez besoin d'au moins un bit pour indiquer si le programme a l'époque ou l'autre déclaration. Dans de nombreux cas, vous pouvez éviter de même que, comme dans le cas que ces différentes branches contiennent une valeur de retour. Ensuite, il suffit d'enregistrer uniquement la valeur de retour (ce qui serait nécessaire de toute façon) et à recalculer la décision sur la branche à partir de la valeur de retour lui-même.

2voto

demoncodemonkey Points 4812

Ici est de savoir comment un autre inverse debugger appelé ODB fonctionne. Extrait:

Omniscient, le Débogage est l'idée de la collecte de "horodateurs" à chaque "point d'intérêt" (la définition de la valeur, faire un appel de méthode, lancer/attraper une exception) dans un programme et permettre à l' programmeur d'utiliser ces temps de timbres explorer l'histoire de ce programme exécuter.

L'ODB ... insère code du programme des classes ils sont chargés et lorsque le programme s'exécute, les événements sont enregistrés.

J'imagine que l'gdb on travaille dans le même genre de chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X