Comandos más difíciles / útiles para el depurador gdb [cerrado]

138

¿Puede publicar sus comandos más difíciles y útiles mientras ejecuta un depurador como gdb o dbx?

Vijay
fuente
Encontré que esta documentación es buena. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

Respuestas:

134
  1. traza inversa completa : traza inversa completa con variables locales
  2. arriba , abajo , cuadro : moverse a través de cuadros
  3. ver : suspender el proceso cuando se cumple una determinada condición
  4. set print pretty on : imprime el código fuente de C perfectamente formateado
  5. establecer inicio de sesión: sesión de depuración de registro para mostrar a otros para obtener asistencia
  6. establecer matriz de impresión en : impresión de matriz bonita
  7. terminar : continuar hasta el final de la función
  8. activar y desactivar : activar / desactivar puntos de interrupción
  9. tbreak : rompe una vez y luego elimina el punto de interrupción
  10. donde : número de línea que se está ejecutando actualmente
  11. info locales : Ver todas las variables locales
  12. info args : Ver todos los argumentos de funciones
  13. lista : ver fuente
  14. rbreak : salto en la función que coincide con la expresión regular
Ramkumar Ramachandra
fuente
77
info locals- Ver todas las variables locales; lista - ver fuente; rbreak - pausa en la función que coincide con la expresión regular.
Paul Biggar
source / path / to / macro / file Y todas mis ingeniosas macros están ahí para ayudarme a depurar en segundos.
Sudhanshu el
1
set print object onpara elementos polimórficos y set print elements 0son dos comandos que uso muy a menudo. Bastante útil
Kiril Kirov
1
Además, t a a bt(significado thread apply all backtrace). Podría usarse con (casi) todos los demás comandos. Especialmente útil con bt full.
Kiril Kirov
101

Inicie gdb con una interfaz de usuario textual

gdb -tui
Amro
fuente
21
No puedo creer que esta característica se me haya escapado durante todos estos años. ¡Gracias, gracias, gracias!
DevSolar
Gracias Me
ahorraste
1
Y otro: <minus> RET
SullX
1
o use cgdb
Patryk
Muy buenas características.
Me
45

A partir de gdb 7.0, hay una depuración reversible , por lo que sus nuevos comandos favoritos son:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.
Paul Biggar
fuente
21

En lugar de iniciar GDB con el parámetro "-tui", también puede cambiar al modo de texto después de un tiempo usando "wh".

martín
fuente
3
¡Ctrl-a a para volver a la vista de línea de comando 'normal'!
Kevin
2
"- 'se puede usar en lugar de' wh '.
Cuanto
66
Ctrl-a a? ¿Es una broma? Parece más como tmux/ screencomando. Y no funciona para mi. Debe ser uno de los que por docs : C-x C-a, C-x a, C-x A.
x-yuri
En realidad es C-x a. También puede cambiar las vistas con C-x 1y C-x 2cuando está en modo tui para ver el ensamblaje también (si es necesario).
Sam Whitlock
16

thread apply all bto thread apply all print $pc: Para descubrir rápidamente lo que están haciendo todos los hilos.

Olof
fuente
¡Ese fue el comando que estaba buscando por mucho, mucho tiempo! ¡Es realmente desagradable revisar los 30 hilos uno por uno!
tothphu
6

Usando la -command=<file with gdb commands>opción mientras activa gdb. Igual que -x <command file>. Este archivo de comandos puede contener comandos de gdb como puntos de interrupción, opciones, etc. Útil en caso de que un ejecutable particular deba someterse a sucesivas ejecuciones de depuración utilizando gdb.

raghava
fuente
También puede usar la -iexopción para agregar comandos individuales en la línea de comando gdb.
doug65536
5

scripting gdb es un buen truco, aparte de eso, me gusta activar / desactivar el bloqueo del planificador para evitar que se ejecuten otros subprocesos cuando estás en uno.

Ben
fuente
1
¿Cómo se configura el bloqueo del planificador?
deft_code
3
set scheduler-locking ondentro de gdb
Ben
¿Cómo haces que esto sea el predeterminado? Lo intenté .gdbinit pero gdb imprime /home/omry/.gdbinit:1: Error en el archivo de comando de origen: Target 'None' no puede admitir este comando.
Omry Yadan
4
  • Usando .gdbinit (archivo de inicio donde puede escribir macros y llamar desde gdb). Coloque .gdbinit en su directorio de inicio para que se recoja cada vez que se carga gdb
  • hilos de información para enumerar todos los hilos activos, y f (#) -> # número de hilo al que desea cambiar

  • a veces uso gdb para convertir de hexadecimal a decimal o binario, es muy útil en lugar de abrir una calculadora

    • p / d 0x10 -> da el equivalente decimal de 0x10
    • p / t 0x10 -> equivalente binario de 0x10
    • p / x 256 -> equivalente hexadecimal de 256
subbul
fuente
4

En lugar de iniciar gdb con la opción -tui para ver un proceso secundario que contiene una pantalla que resalta dónde está la línea de código de ejecución en su programa, entre y salga de esta función con Cx o y Cx a. Esto es útil si está utilizando la función y qué no usar temporalmente para poder usar la flecha hacia arriba para obtener un comando anterior.

Rose Perrone
fuente
2
puede cambiar el foco a la ventana de comandos usando focus cmdpara que funcionen las flechas arriba / abajo. Cambias de nuevo usando focus src.
Nathan Fellman
3

Esto puede ser útil, estoy seguro de que podría mejorarse, ayuda bienvenida:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)
elmarco
fuente