Question

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

Pour inverser le débogage de travailler, il me semble que vous devez stocker l'ensemble de l'état de la machine y compris la mémoire pour chaque étape. Cela rendrait la performance incroyablement lent, sans parler en utilisant beaucoup de mémoire. Comment ces problèmes sont résolus?

Était-ce utile?

La solution

Je suis responsable de GDB et l'un des auteurs de la nouvelle mise au point inverse. Je serais heureux de parler de la façon dont cela fonctionne. Comme plusieurs personnes ont spéculé, vous devez économiser suffisamment d'état de la machine que vous pouvez restaurer plus tard. Il y a un certain nombre de régimes, l'un est de simplement sauvegarder les registres ou emplacements de mémoire qui sont modifiés par chaque instruction de la machine. Puis, à « défaire » cette instruction, vous revenez simplement les données dans les registres ou emplacements de mémoire.

Oui, il est cher, mais modernes sont si CPUs rapides que lorsque vous êtes interactif de toute façon (faire pas à pas ou points d'arrêt), vous ne remarquez pas vraiment beaucoup.

Autres conseils

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

Une autre solution pour la mettre en œuvre est de tracer l'exécution sur le matériel physique, comme cela se fait par GreenHills et Lauterbach dans leur débogueurs matériel. Sur la base de cette trace fixe de l'action de chaque instruction, vous pouvez alors passer à tout moment dans 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.

Une autre façon est d'utiliser un point de contrôle + méthode ré-exécution, qui est utilisé par Workstation 6.5 et VmWare Virtutech Simics 3.0 (et versions ultérieures), et qui semble être à venir avec Visual Studio 2010. Ici, vous utilisez une machine virtuelle ou un simulateur pour obtenir un niveau d'indirection sur l'exécution d'un système. Vous videz régulièrement l'état entier sur le disque ou la mémoire, puis compter sur le simulateur pouvoir ré-exécuter le même chemin déterministe du programme exact.

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 prenez un certain point de contrôle du point t la liste de diffusion gdb et la discussion qui suit que sur la liste de diffusion pour gdb plus de détails. Je l'utilise moi-même approche tout à fait régulièrement pour déboguer le code difficile, en particulier dans les pilotes de périphériques et au début des bottes OS.

Une autre source d'information est un Virtutech livre blanc sur checkpointing (que j'ai écrit, divulgation complète).

Lors d'une séance de EclipseCon, nous avons également demandé comment ils le font avec Chronon Debugger pour Java. Celui-là ne vous permet pas de en fait pas en arrière, mais peut lire une exécution de programme enregistré de telle sorte que se sent comme le débogage inverse. (La principale différence est que vous ne pouvez pas changer le programme en cours d'exécution dans le débogueur Chronon, alors que vous pouvez le faire dans la plupart des autres Java débogueurs.)

Si je comprends bien, il manipule le code octet du programme en cours, de sorte que chaque changement d'un état interne du programme est enregistré. États extérieurs ne doivent pas être enregistrés en plus. Si elles influencent votre programme d'une certaine façon, vous devez avoir une adaptation variable interne état externe (et donc cette variable interne suffit).

Pendant le temps de la lecture, ils peuvent alors recréer essentiellement chaque état du programme en cours d'exécution à partir des changements d'état enregistrés.

Il est intéressant les changements d'état sont beaucoup plus petits que l'on pourrait attendre le premier coup d'oeil. Donc, si vous avez une condition « si », on pourrait penser que vous avez besoin d'au moins un bit pour enregistrer si le programme a pris la then- ou l'autre-déclaration. Dans de nombreux cas, vous pouvez même éviter que, comme dans le cas où ces différentes branches contiennent une valeur de retour. Ensuite, il suffit d'enregistrer seulement la valeur de retour (qui serait nécessaire de toute façon) et recalcul la décision de la branche exécutée à partir de la valeur de retour lui-même.

Bien que cette question est ancienne, la plupart des réponses sont aussi, et comme reste un sujet intéressant, je poste une réponse 2015. Les chapitres 1 et 2 de ma thèse de maîtrise ès sciences, La combinaison de débogage inverse et la programmation en direct vers la pensée visuelle programmation informatique , couvre certaines des approches historiques pour inverser le débogage (en particulier l'accent sur la snapshot- (ou checkpoint) approche -et-replay), et explique la différence entre elle et omniscient débogage:

  

L'ordinateur, ayant exécuté avant le programme jusqu'à un certain point, devrait vraiment être en mesure de nous fournir des informations à ce sujet. Une telle amélioration est possible, et se trouve dans ce qu'on appelle omniscient débogueurs. Ils sont généralement classés comme inverse débogueurs, bien qu'ils puissent être décrits de façon plus précise que « l'exploitation forestière de l'histoire » débogueurs, comme ils l'information qu'enregistrer en cours d'exécution pour afficher ou requête ultérieurement, plutôt que de permettre au programmeur de l'étape en fait en arrière dans le temps dans un programme d'exécution . « Omniscient » vient du fait que toute l'histoire de l'état du programme, ayant été enregistré, est disponible pour le débogueur après l'exécution. Il est alors nécessaire de relancer le programme, et pas besoin d'instrumentation de code manuel.

     

débogage omniscient par logiciel a commencé avec le système EXDAMS 1969 où il a été appelé « l'histoire-lecture debug-temps ». Le débogueur GNU, GDB, a soutenu le débogage omniscient depuis 2009, grâce à sa fonctionnalité «processus d'enregistrement et de lecture. TotalView, UndoDB et Chronon semblent être les meilleures débogueurs omniscient actuellement disponibles, mais sont des systèmes commerciaux. TOD, pour Java, semble être la meilleure alternative open-source, qui utilise la relecture déterministe partielle, ainsi que la capture de trace partielle et une base de données distribuée pour permettre l'enregistrement des gros volumes d'informations en cause.

     

débogueurs qui ne permettent pas seulement la navigation d'un enregistrement, mais sont effectivement en mesure de revenir en arrière dans le temps d'exécution, existent également. Ils peuvent être décrits de façon plus précise que le dos-à-temps, le temps Voyage, bidirectionnel ou inverse débogueurs.

     

Le premier système a été le prototype 1981 COPE ...

Nathan Fellman a écrit:

  

Mais n'inverse le débogage vous permet de rouler en arrière suivant et pas les commandes que vous avez tapé, ou il vous permet d'annuler un certain nombre d'instructions?

Vous pouvez annuler un certain nombre d'instructions. Vous n'êtes pas limité à, par exemple, ne s'arrêtant aux points où vous avez arrêté quand vous aller de l'avant. Vous pouvez définir un nouveau point d'arrêt et tourner en sens inverse à elle.

  

Par exemple, si je mets un point d'arrêt sur une instruction et le laisser courir jusque-là, puis-je sauvegarder puis rouler à l'instruction précédente, même si je sauté dessus?

Oui. Tant que vous avez activé le mode d'enregistrement avant l'exécution au point d'arrêt.

est ainsi une autre inverse débogueur appelé ODB fonctionne. Extrait:

  

Omniscient Debugging est l'idée de   collecte « horodatages » à chaque   « Point d'intérêt » (réglage d'une valeur,   faire un appel de méthode,   lancer / attraper une exception) dans un   programme et permettant la   programmeur d'utiliser ces horodateurs à   explorer l'histoire de ce programme   exécuter.

     

Le ODB ... inserts   code dans les cours du programme comme   ils sont chargés et lorsque le programme   courses, les événements sont enregistrés.

Je devine que gdb on travaille dans le même genre de façon.

débogage inverse signifie que vous pouvez exécuter le programme en arrière, ce qui est très utile pour traquer la cause d'un problème.

Vous n'avez pas besoin de stocker l'état complet de la machine pour chaque étape, seuls les changements. Il est sans doute encore assez cher.

mozilla rr est une alternative plus robuste pour le débogage GDB inverse

https://github.com/mozilla/rr

de GDB enregistrement intégré et la lecture a des limites sévères, par exemple pas de support pour les instructions AVX:

scroll top