Obtenir gdb pour enregistrer une liste de points d’arrêt?

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:

  1. démarrer GDB (en mode normal)
  2. activer la journalisation: set logging on – maintenant, il ne devrait pas se plaindre.
  3. basculer en arrière vers le mode TUI et faire des choses GDB
  4. quand je veux enregistrer quelque chose (comme un énorme vidage de backtrace) – basculer en mode normal

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.

  • Enregistrer les points d’arrêt: bsave {nomfichier}
  • Charger les points d’arrêt: bload {nomfichier}

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?