91 votes

Aller à la ligne précédente dans gdb

Est-il possible dans gdb d’aller sur une ligne avant la ligne en cours d’exécution? par exemple:

 
void my_fun( somePtrType** arr,int start,int end)
{
 // arr is an array of pointers to somePtrType
  //line a
 ... some assignments
 swap(&arr[ind1] , &arr[ind2] ) ;
 //line b (current line )
}
 

Je suis actuellement à la ligne b et peux y examiner les valeurs arr , mais je souhaite revenir à la ligne a et examiner le contenu de arr à ce moment-là.

Je pense que cela pourrait ne pas être possible car un débogueur peut exécuter un code au ralenti, mais ne peut pas le faire exécuter à l'envers.
Plus d'idées ..

Merci

130voto

Michael Snyder Points 2457

Oui! Avec la nouvelle version 7.0 gdb, c'est exactement ce que vous pouvez faire!

La commande serait " reverse-step " ou " reverse-next ".

Vous pouvez obtenir gdb-7.0 sur ftp.gnu.org:/pub/gnu/gdb

Si vous rencontrez l’erreur suivante: Target child does not support this command. essayez d’ajouter target record au début de l’exécution, après le démarrage de run .

15voto

Michael Snyder Points 2457

Oui, cela est possible et simple, maintenant, avec du matériel réel (c.-à-d. Pas seulement avec une VM). GDB-7.0 prend en charge le débogage inversé avec des commandes telles que l'inverse-pas et l'inverse-continue, sur des machines Linux x86 natives.

Il y a un tutoriel ici: http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial

7voto

nik Points 8025

Si votre programme est court, le truc habituel est,

  1. Placez un nouveau point d'arrêt à la ligne précédente
  2. fire r pour relancer le débogage

GDB a été fait pour ça!

5voto

mohit Points 380

Réponse courte: Non.

Pour la solution de contournement lire ci-dessous.

Si à la ligne b, il n'est pas possible de déterminer la valeur à la ligne a, il est possible de se connecter à la valeur de l'arr en a et b et d'autres endroits par un seul point d'arrêt d'être touché.

  • Utiliser la fonction "affichage" de la commande (*afficher variable_name* où variable_name est pour être remplacé par arr, *arr, **arr selon ce que vous cherchez), de sorte que, lorsqu'un point d'arrêt est atteint, le contenu de la variable_name seront déversés sur l'écran. Notez que vous pouvez ajouter à la liste d'affichage lorsque le variabe_name est dans la portée, de sorte que peut exiger que vous attendez votre premier point d'arrêt.
  • Créer des points d'arrêt à divers endroits de code où vous êtes intéressé à vous connecter à la valeur de variable_name. L'un de ces points d'arrêt serait à la ligne une.
  • Pour chaque point d'arrêt, utiliser la commande (*commande breakpoint_number*) et demandez à votre point d'arrêt pour ne pas interrompre l'exécution du programme. La commande que vous devez utiliser est de continuer suivie par la fin. Voir l'exemple ci-dessous.

(gdb) de commande 1

Type de commandes lorsque le point d'arrêt 1 est frappé, un par ligne. Terminer avec une ligne disant "fin".

continuer

fin

  • Placer un point d'arrêt sur la ligne b du.

Maintenant, quand tous les autres la journalisation des points d'arrêt sont touchés, la valeur d'arr seront déversés sur l'écran, mais le point d'arrêt ne sera pas attendre pour l'interaction de l'utilisateur et s'auto-continuer. Lorsque vous atteignez un point d'arrêt à la ligne b, vous pouvez voir les dernières valeurs d'arr qui doit être enregistrée dans gdb lui-même.

Selon la situation, vous pouvez aussi dump (et afficher) un grand nombre d'informations utiles. Pour exemple vous pouvez aussi faire un dump d'un compteur de boucle (dis-je) si la fonction ci-dessus est appelé 10000 fois dans une boucle. Cela dépend vraiment de ce que vous essayez d'atteindre.

1voto

ax. Points 22269

selon http://sourceware.org/gdb/current/onlinedocs/gdb.html#SEC51 , et "si l'environnement cible le prend en charge", oui.

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