Stampa Gdb su file invece che su stdout


104

Sto eseguendo gdb e voglio esaminare uno di quegli sfortunati oggetti di dio. Ci vogliono molte pagine (e ho un monitor da 24 "girato lateralmente!) Per vedere l'intera cosa. Per facilità d'uso, vorrei che gdb stampasse l'oggetto su un file invece che sullo schermo in modo da poterlo aprire in vi e spostarsi con facilità. Con tutta la versatilità di gdb, ci deve essere un modo per farlo, giusto?

Risposte:


151

Devi abilitare la registrazione.

(gdb) set logging on

Puoi dirgli quale file usare.

(gdb) set logging file my_god_object.log

Ed è possibile esaminare la configurazione di registrazione corrente.

(gdb) show logging

15
E se vuoi che l'output vada solo al file di registro, usa set logging redirect on.
Ben C

5
Non dovremmo impostare set logging file my_god_object.logprima set logging on?
Ingegnere senza herpes il

Questo vantaggio tail -fed awkè stato davvero utile oggi. Grazie!
remcycles il

12

Ho scoperto che puoi reindirizzare l'output da gdb a un file tramite il runcomando:

(gdb) run > outfile

11
Questo sarebbe l'output del programma in fase di debug, non l'output di gdb stesso. OP voleva registrare l'output di gdb.
il paolo


@thepaul ma questo è in effetti molto utile dato che sto eseguendo il debug di un programma QT che cestina semplicemente lo stdin di gdb con la sua spazzatura
QDebug

@ rostamn739 oops, non ha aiutato affatto
rostamn739

12

Estendendo la risposta di @ qubodup

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

lo -exswitch esegue un comando gdb. Quindi quanto sopra carica il file core, esegue il btcomando, quindi il quitcomando. L'output viene scritto backtrace.loge anche sullo schermo.

Un'altra utile invocazione di gdb (che fornisce stacktrace con le variabili locali di tutti i thread) è

gdb core.3599 -ex 'thread apply all bt full' -ex quit

Su alcuni sistemi, è necessario digitaregdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread applica tutto bt full' -ex quit Aggiungi --batch per eseguire senza prompt -eg sudo gdb --batch core.3599 -ex 'thread applica tutto bt full' -ex esci> output .log
David Skelly

9

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

Potresti voler salvare l'output dei comandi gdb in un file. Ci sono diversi comandi per controllare la registrazione di gdb.

set logging on

Abilita la registrazione.

set logging off

Disabilita la registrazione.

set logging file file

Modificare il nome del file di registro corrente. Il file di registro predefinito è gdb.txt.

set logging overwrite [on|off]

Per impostazione predefinita, gdb verrà aggiunto al file di registro. Imposta sovrascrittura se si desidera impostare l'accesso per sovrascrivere invece il file di registro.

set logging redirect [on|off]

Per impostazione predefinita, l'output di gdb andrà sia al terminale che al file di log. Impostare il reindirizzamento se si desidera che l'output vada solo al file di registro.

show logging

Mostra i valori correnti delle impostazioni di registrazione.



5

Un metodo semplice per registrare gdb in un file mentre si vede ancora l'output (che facilita la scrittura dei comandi) è usare tee:

gdb command |& tee gdb.log

1

Sebbene ci siano molte buone risposte qui, devo ancora pubblicare l'unica cosa che ha funzionato per me:

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

Questo era l'unico modo per ottenere gdb e output binario nello stesso file log.txt, visualizzandolo anche sulla console.

MODIFICARE:

Attenzione: l' output sembra non essere parzialmente sincronizzato tra l'output gdb e l'output binario. Qualcuno può confermare? Potresti voler controllare se il tuo client telnet / ssh ha una funzione per registrare l'output che vedi nella tua console.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.