OK, info break répertorie les points d’arrêt, mais pas dans un format qui fonctionnerait bien avec leur réutilisation en utilisant la commande – comme dans cette question . Est-ce que gdb a une méthode pour les transférer dans un fichier acceptable pour une nouvelle saisie? Parfois, lors d’une session de débogage, il est nécessaire de redémarrer gdb après avoir créé un ensemble de points d’arrêt pour le test.
Edit: le fichier .gdbinit a le même problème que –command. La commande info break ne liste pas les commandes, mais plutôt une table pour la consommation humaine.
Pour élaborer, voici un extrait de la pause info:
(gdb) pause d'information Adresse de Num Type Disp Enb 1 point d'arrêt garde y 0x08048517
A partir de gdb 7.2, vous pouvez maintenant utiliser la commande save breakpoints.
save breakpoints Save all current breaksharepointfinitions to a file suitable for use in a later debugging session. To read the saved breaksharepointfinitions, use the `source' command.
Utilisez la source
pour restaurer les points d’arrêt enregistrés à partir du fichier.
Cette réponse est obsolète, gdb prend désormais en charge l’enregistrement direct. Voir cette réponse .
Vous pouvez utiliser la journalisation:
(gdb) b main Breakpoint 1 at 0x8049329 (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 (gdb) set logging file breaks.txt (gdb) set logging on Copying output to breaks.txt. (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 (gdb) q
Le fichier breaks.txt contient maintenant:
Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329
Ecrire un script awk qui le transforme en un format utile pour le .gdbinit
ou un fichier --command
est facile. Ou vous pouvez même faire en sorte que le script émette des --eval-command
distinctes --eval-command
sur la ligne de commande gdb …
L’ajout de cette petite macro à .gdbinit vous aidera à le faire:
# call with dump_breaks file.txt define dump_breaks set logging file $arg0 set logging redirect on set logging on info breakpoints set logging off set logging redirect off end
Placez vos commandes et points d’arrêt gdb dans un fichier .gdbinit comme vous pourriez les saisir à l’invite gdb> et gdb les chargera et les exécutera automatiquement au démarrage. C’est un fichier par répertoire, vous pouvez donc avoir différents fichiers pour différents projets.
Une extension de l’extension d’anon à la réponse de Johannes:
.gdbinit: define bsave shell rm -f brestore.txt set logging file brestore.txt set logging on info break set logging off # reformat on-the-fly to a valid gdb command file shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb end document bsave store actual breakpoints end define brestore source brestore.gdb end document brestore restore breakpoints saved by bsave end
Avec brestore
vous pouvez restaurer les points d’arrêt enregistrés avec bsave
.
Extension à la réponse de Johannes: vous pouvez reformater automatiquement la sortie de la info break
en un fichier de commande gdb valide:
.gdbinit: define bsave shell rm -f brestore.txt set logging file brestore.txt set logging on info break set logging off # reformat on-the-fly to a valid gdb command file shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb end document bsave store actual breakpoints end
Ensuite, vous avez un fichier de commandes valide dans brestore.gdb
Cela a fonctionné pour moi lorsque l’application est compilée avec -g
.
EDIT : testé avec succès avec gdb v6.8 sur Ubuntu Karmic.
mettez ce qui suit dans ~ / .gdbinit pour définir bsave et brestore comme commandes gdb pour sauvegarder et restaurer les points d’arrêt.
define bsave save breakpoints ~/.breakpoints end define brestore source ~/.breakpoints end
avertissement: le protocole de sortie actuel ne prend pas en charge la redirection
J’ai également cette erreur / avertissement dans GDB lorsque vous essayez d’activer la journalisation en mode TUI, mais la journalisation semble fonctionner en mode “non-TUI”. Donc, je quitte le mode TUI chaque fois que je veux me connecter. (Basculez dans le mode TUI avec CTRL-X , CTRL-A ).
Voici comment je travaille:
set logging on
– maintenant, il ne devrait pas se plaindre. J’espère que ça aide, / M: o)
Je sais que c’est un vieux sujet mais il est apparu dans ma recherche google pour m’aider à le faire. Je suis nouveau sur gdb et j’ai trouvé l’ajout suivant à la réponse ci-dessus utile pour enregistrer / charger les points d’arrêt dans un fichier spécifique.
Comme ci-dessus, ajoutez le code suivant au fichier ~ / .gdbinit
#Save breakpoints to a file define bsave if $argc != 1 help bsave else save breakpoints $arg0 end end document bsave Saves all current defined breakpoints to the defined file in the PWD Usage: bsave end #Loads breakpoints from a file define bload if $argc != 1 help bload else source $arg0 end end document bload Loads all breakpoints from the defined file in the PWD Usage: bload end
Le problème est que définir un point d’arrêt est sensible au contexte. Que faire si vous avez deux fonctions statiques nommées foo? Si vous déboguez déjà l’un des modules qui définit foo, alors gdb supposera que vous en avez voulu dire. Mais si vous videz simplement “break foo” dans un fichier et que vous lisez ce fichier au démarrage, vous ne saurez pas quelle fonction vous voulez dire.
D’autres idées? j’ai
warning: Current output protocol does not support redirection
après
set logging on
MODIFIER:
Je sais que cette question est “comment enregistrer une liste de points d’arrêt”, mais je découvre simplement qu’avec gdb, nous pouvons simplement définir des points d’arrêt “enregistrés dans un fichier” en
gdb> source breakpoints.txt
où breakpoints.txt est un fichier comme ceci:
break main.cpp:25 break engine.cpp:465 break wheel.cpp:57
Le problème est que la définition d’un sharepoint rupture est sensible au contexte. Que faire si vous avez deux fonctions statiques nommées foo? Si vous déboguez déjà l’un des modules qui définit foo, alors gdb supposera que vous en avez voulu dire. Mais si vous videz simplement “break foo” dans un fichier et que vous lisez ce fichier au démarrage, vous ne saurez pas quelle fonction vous voulez dire.
Je n’ai pas les points de mod pour répondre, mais ce que vous faites est de rendre vos points d’arrêt explicites, en spécifiant le fichier source et le numéro de ligne. Si foo () est spécifié à la fois dans foo.c: 42 et dans bar.c: 1337
break foo.c:42 break bar.c:1337
Vous pouvez également spécifier un point d’arrêt source qui ne se déclenche que si le programme s’exécute sous gdb. Voir Comment détecter si le processus en cours est exécuté par GDB?