Gdb imprime a un archivo en lugar de stdout

104

Estoy ejecutando gdb y quiero examinar uno de esos desafortunados objetos de dios. Se necesitan muchas páginas (¡y tengo un monitor de 24 "volteado hacia los lados!) Para ver todo. Para facilitar el uso, me gustaría que gdb imprima el objeto en un archivo en lugar de en la pantalla para poder abrirlo en vi y muévete con facilidad Con toda la versatilidad de gdb, debe haber una forma de hacer esto, ¿verdad?

metáfora pitónica
fuente

Respuestas:

151

Necesita habilitar el registro.

(gdb) set logging on

Puede decirle qué archivo usar.

(gdb) set logging file my_god_object.log

Y puede examinar la configuración de registro actual.

(gdb) show logging
Tadeusz A. Kadłubowski
fuente
15
Y si desea que la salida vaya solo al archivo de registro, use set logging redirect on.
Ben C
5
¿No deberíamos ponernos set logging file my_god_object.logantes set logging on?
Ingeniero libre de herpes
Este plus tail -fy awkfue realmente útil hoy. ¡Gracias!
remcycles
12

Descubrí que puede redirigir la salida de gdb a un archivo a través del runcomando:

(gdb) run > outfile
Lucas Gabriel Sánchez
fuente
11
Esa sería la salida del programa que se está depurando, no la salida de gdb en sí. OP quería registrar la propia salida de gdb.
el pablo
ver también: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul, pero esto es de hecho muy útil ya que estoy depurando un programa QT que simplemente destruye el stdin de gdb con su basura
QDebug
@ rostamn739 oops, no ayudó en absoluto
rostamn739
12

Ampliando la respuesta de @ qubodup

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

el -exconmutador ejecuta un comando gdb. Entonces, lo anterior carga el archivo principal, ejecuta el btcomando, luego el quitcomando. La salida se escribe backtrace.logy también en la pantalla.

Otra invocación de gdb útil (que proporciona stacktrace con variables locales de todos los hilos) es

gdb core.3599 -ex 'thread apply all bt full' -ex quit
user7610
fuente
En algunos sistemas, debe escribirgdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'subproceso aplicar todo bt completo' -ex salir Agregar - lote para ejecutar sin un mensaje -eg sudo gdb --batch core.3599 -ex 'subproceso aplicar todo bt completo' -ex salir> salida .log
David Skelly
9

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

Es posible que desee guardar la salida de los comandos gdb en un archivo. Hay varios comandos para controlar el registro de gdb.

set logging on

Habilitar el registro.

set logging off

Desactive el registro.

set logging file file

Cambie el nombre del archivo de registro actual. El archivo de registro predeterminado es gdb.txt.

set logging overwrite [on|off]

Por defecto, gdb se agregará al archivo de registro. Configure sobrescribir si desea configurar el inicio de sesión para sobrescribir el archivo de registro.

set logging redirect [on|off]

Por defecto, la salida de gdb irá tanto al terminal como al archivo de registro. Establezca la redirección si desea que la salida vaya solo al archivo de registro.

show logging

Muestra los valores actuales de la configuración de registro.

husin alhaj ahmade
fuente
2
Copie y pegue de sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html sin citar.
Ingeniero libre de herpes
5

Un método simple para registrar gdb en un archivo sin dejar de ver la salida (lo que facilita la escritura de comandos) es usar tee:

gdb command |& tee gdb.log
qubodup
fuente
1

Aunque hay muchas buenas respuestas aquí, todavía tengo que publicar lo único que funcionó para mí:

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

Esta era la única forma de obtener gdb y la salida binaria en el mismo archivo log.txt, mientras también se veía en la consola.

EDITAR:

Precaución: La salida parece no estar sincronizada parcialmente entre la salida gdb y la salida binaria. ¿Alguien puede confirmar? Es posible que desee verificar si su cliente telnet / ssh tiene una función para registrar la salida que ve en su consola.

Niko
fuente