Comment faire une boucle dans un GDB script jusqu'programme est terminé?
define traverse
while(CONDITION)
if $start == 0
set $start = 1
print_node
print_rss_item
else
continue
print_node
print_rss_item
end
end
end
Quelles conditions dois-je arrêter la boucle si le programme est terminé?
Je suppose que
$start = 1
est la clause qui arrête la boucle. Donc, vous voulez while($start == 0)
? Ce lien devrait aider sourceware.org/gdb/onlinedocs/gdb/Command-Files.htmlOriginalL'auteur user3084621 | 2013-12-09
Vous devez vous connecter pour publier un commentaire.
Regardant votre gdb script:
Plusieurs choses à noter:
Le gdb script (appelé "débogueur") et le programme débogué sont toujours en fonctionnement dans un basculement de mode: à CHAQUE fois que LE GDB SCRIPT de s'EXÉCUTER, le programme débogué est en pause et ne s'exécute PAS, et chaque fois que le programme débogué est en cours d'exécution, le gdb script est en pause et de ne PAS COURIR.
Pourquoi est-ce donc? C'est parce que chaque fois que le programme débogué est en mode pause (lire "ptrace()" de l'API et de ses divers option: PEEKUSER, POKEUSER, PTRACE_CONT), le débogueur peut effectivement proprement (et de mémoire-systématiquement) lire la mémoire du programme débogué, sans crainte de la corruption, et donc toutes ses valeurs de variables etc.
Lorsque le débogueur n'est pas en cours d'exécution, c'est à dire, il a exécuté la "continuer", où le contrôle est passé à la programme débogué, le programme débogué peut ainsi continuer à exécuter et de modifier sa propre mémoire, sans crainte de, à tort, d'être lu par un autre processus, car il ne s'est passé.
Alors, comment savons-nous quand le programme débogué a pris fin? Lorsque "continuer" échec et donc la gdbscript ne va pas continuer à fonctionner. Mais si vous l'installation d'un programme débogué, sans points d'arrêt, puis de l'exécution de la gdb commande "exécuter", vous trouverez le programme débogué fonctionner en continu, sans gdb script d'avoir une chance de s'exécuter.
De manière efficace que si votre script est en cours d'exécution, puis programme débogué est en mode d'ARRÊT, et vice versa. Et si le programme débogué a terminé en appelant exit(), le gdb script ne sera pas être en cours d'exécution.
par exemple:
Puis en exécutant "gdb /bin/ls" et suivi de "pause écrire" et "run-al", et puis "myloop_print 10000" (la séquence ou l'ordre est important), nous pouvons voir que chaque "écrire" il va se casser et gdbscript permet d'imprimer le compteur.
Et dernières lignes exécutées sont:
Qui montre clairement que le dernier compteur d'impression est de 286, même si j'avais spécifié 10000 que la limite.
L'exécution de la macro sans le programme débogué en cours d'exécution:
Nous pouvons voir que le gdbscript ne sera pas exécuté.
Et si vous n' "gdb /bin/ls" et suivi de "myloop_print 10000" (en supposant que la macro est définie à l'intérieur .gdbinit), puis vous obtiendrez gdbscript cours d'exécution à l'achèvement de 10000 boucles sans le programme débogué toujours en cours d'exécution.
OriginalL'auteur Peter Teoh
Simplement de la boucle dans une boucle infinie. Elle va sortir quand le programme est terminé.
OriginalL'auteur petersohn