Gdb imprime dans un fichier au lieu de stdout

104

Je dirige gdb et je veux examiner l'un de ces objets dieux malheureux. Il faut beaucoup de pages (et j'ai un écran de 24 pouces tourné sur le côté!) Pour voir le tout. Pour plus de facilité, j'aimerais que gdb imprime l'objet dans un fichier au lieu de l'écran afin de pouvoir l'ouvrir dans vi et se déplacer avec facilité Avec toute la polyvalence de gdb, il doit y avoir un moyen de le faire, non?

métaphore pythonique
la source

Réponses:

151

Vous devez activer la journalisation.

(gdb) set logging on

Vous pouvez lui dire quel fichier utiliser.

(gdb) set logging file my_god_object.log

Et vous pouvez examiner la configuration de journalisation actuelle.

(gdb) show logging
Tadeusz A. Kadłubowski
la source
15
Et si vous voulez que la sortie aille uniquement dans le fichier journal, utilisez set logging redirect on.
Ben C
5
Ne devrions-nous pas nous fixer set logging file my_god_object.logavant set logging on?
Herpes Free Engineer
Cet avantage tail -fet a awkété vraiment utile aujourd'hui. Merci!
remcycles
12

J'ai trouvé que vous pouvez rediriger la sortie de gdb vers un fichier via la runcommande:

(gdb) run > outfile
Lucas Gabriel Sánchez
la source
11
Ce serait la sortie du programme en cours de débogage, pas la sortie de gdb lui-même. OP voulait enregistrer la propre sortie de gdb.
le paul
voir aussi: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul mais c'est en fait très utile car je débogue un programme QT qui supprime simplement le stdin de gdb avec ses ordures
QDebug
@ rostamn739 oups, n'a pas aidé du tout
rostamn739
12

Extension de la réponse de @ qubodup

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

le -excommutateur exécute une commande gdb. Ainsi, ce qui précède charge le fichier principal, exécute la btcommande, puis la quitcommande. La sortie est écrite sur backtrace.loget également sur l'écran.

Un autre appel gdb utile (donnant stacktrace avec les variables locales de tous les threads) est

gdb core.3599 -ex 'thread apply all bt full' -ex quit
user7610
la source
Sur certains systèmes, vous devez tapergdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'thread apply all bt full' -ex quit Ajouter --batch pour exécuter sans invite -eg sudo gdb --batch core.3599 -ex 'thread apply all bt full' -ex quit> sortie .log
David Skelly
9

Depuis https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

Vous souhaiterez peut-être enregistrer la sortie des commandes gdb dans un fichier. Il existe plusieurs commandes pour contrôler la journalisation de gdb.

set logging on

Activez la journalisation.

set logging off

Désactivez la journalisation.

set logging file file

Modifiez le nom du fichier journal actuel. Le fichier journal par défaut est gdb.txt.

set logging overwrite [on|off]

Par défaut, gdb s'ajoutera au fichier journal. Définissez le remplacement si vous souhaitez que la connexion remplace le fichier journal.

set logging redirect [on|off]

Par défaut, la sortie gdb ira à la fois au terminal et au fichier journal. Définissez la redirection si vous souhaitez que la sortie aille uniquement dans le fichier journal.

show logging

Afficher les valeurs actuelles des paramètres de journalisation.

husin alhaj ahmade
la source
2
Copiez-collez sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html sans citation.
Herpes Free Engineer
5

Une méthode simple pour enregistrer gdb dans un fichier tout en affichant la sortie (ce qui facilite l'écriture des commandes) consiste à utiliser tee:

gdb command |& tee gdb.log
qubodup
la source
1

Bien qu'il y ait beaucoup de bonnes réponses ici, je dois encore poster la seule chose qui a fonctionné pour moi:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

C'était le seul moyen d'obtenir gdb et la sortie binaire dans le même fichier log.txt, tout en le voyant également sur la console.

ÉDITER:

Attention: la sortie semble ne pas être partiellement synchronisée entre la sortie gdb et la sortie binaire. Quelqu'un peut-il confirmer? Vous voudrez peut-être vérifier si votre client telnet / ssh a une fonction pour enregistrer la sortie que vous voyez dans votre console.

Niko
la source