Gdb imprime em arquivo em vez de stdout

104

Estou executando o gdb e quero examinar um desses infelizes objetos divinos. São necessárias muitas páginas (e eu tenho um monitor de 24 "virado de lado!) Para ver tudo. Para facilitar o uso, gostaria que o gdb imprimisse o objeto em um arquivo em vez da tela para que eu pudesse abri-lo em vi e se mova com facilidade. Com toda a versatilidade do gdb, deve haver uma maneira de fazer isso, certo?

metáfora pitônica
fonte

Respostas:

151

Você precisa habilitar o registro.

(gdb) set logging on

Você pode dizer qual arquivo usar.

(gdb) set logging file my_god_object.log

E você pode examinar a configuração de registro atual.

(gdb) show logging
Tadeusz A. Kadłubowski
fonte
15
E se você quiser que a saída vá apenas para o arquivo de log, use set logging redirect on.
Ben C
5
Não deveríamos definir set logging file my_god_object.logantes set logging on?
Herpes Free Engineer
Este plus tail -fe awkfoi muito útil hoje. Obrigado!
remcycles de
12

Descobri que você pode redirecionar a saída do gdb para um arquivo por meio do runcomando:

(gdb) run > outfile
Lucas Gabriel Sánchez
fonte
11
Essa seria a saída do programa que está sendo depurado, não a saída do próprio gdb. OP queria registrar a própria saída do gdb.
o paul
veja também: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul mas isso é na verdade muito útil porque estou depurando um programa QT que apenas destrói o stdin do gdb com seu lixo
QDebug
@ rostamn739 oops, não ajudou em nada
rostamn739
12

Ampliando a resposta de @qubodup

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

o -exswitch executa um comando gdb. Assim, o acima carrega o arquivo principal, executa o btcomando e, em seguida, o quitcomando. A saída é gravada backtrace.loge também na tela.

Outra invocação de gdb útil (fornecendo stacktrace com variáveis ​​locais de todos os threads) é

gdb core.3599 -ex 'thread apply all bt full' -ex quit
usuário7610
fonte
Em alguns sistemas, você precisa digitargdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'thread aplicar todo bt full' -ex quit Adicionar --batch para rodar sem um prompt -eg sudo gdb --batch core.3599 -ex 'thread aplicar todo bt full' -ex quit> saída .log
David Skelly
9

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

Você pode querer salvar a saída dos comandos gdb em um arquivo. Existem vários comandos para controlar o registro do gdb.

set logging on

Habilite o registro.

set logging off

Desative o registro.

set logging file file

Altere o nome do arquivo de log atual. O arquivo de log padrão é gdb.txt.

set logging overwrite [on|off]

Por padrão, o gdb será anexado ao arquivo de log. Defina overwrite se quiser definir o logon para sobrescrever o arquivo de log.

set logging redirect [on|off]

Por padrão, a saída do gdb irá para o terminal e para o arquivo de log. Defina o redirecionamento se quiser que a saída vá apenas para o arquivo de log.

show logging

Mostra os valores atuais das configurações de registro.

husin alhaj ahmade
fonte
2
Copie a pasta de sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html sem citação.
Herpes Free Engineer
5

Um método simples para registrar gdb em um arquivo enquanto ainda vê a saída (o que facilita a gravação de comandos) é usar tee:

gdb command |& tee gdb.log
qubodup
fonte
1

Embora haja muitas respostas boas aqui, ainda tenho que postar a única coisa que funcionou para mim:

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

Essa era a única maneira de obter a saída gdb e binária no mesmo arquivo log.txt, ao mesmo tempo em que o visualizava no console.

EDITAR:

Cuidado: A saída parece não estar parcialmente sincronizada entre a saída gdb e a saída binária. Alguém pode confirmar? Você pode querer verificar se o seu cliente telnet / ssh tem uma função para registrar a saída que você vê em seu console.

Niko
fonte