2008-09-26 16 views
12

Como desarrollador, ¿cómo usas gdb para rastrear errores dentro de tu código? ¿Qué trucos de técnicas usas para hacerte la vida más fácil?¿Cómo se usa gdb para depurar el código?

+0

¡Me hago la vida más fácil usando un IDE que integra GDB!;) – Dan

+0

Lo cual es bueno cuando es una opción. Me dijeron que mi trabajo se unirá al siglo XXI en uno o dos años. Sin embargo, siempre es útil saber cómo hacer algo manualmente para beneficiarse de todas las características, como ejecutar sus propias funciones con variables del punto actual en el código. –

Respuesta

2

En general, usted encuentra algo que no es como debería ser, y trabaja hacia atrás hasta que comprenda por qué.

El más obvio es el más útil: establecer un punto de interrupción en una función o número de línea y recorrer el código línea por línea.

Otro consejo útil es tener funciones mostrar para todas sus estructuras/objetos, incluso si nunca se utilizan en su programa, porque se puede ejecutar estas funciones desde dentro de GDB:

gdb> p show_my_struct(struct) 

My custom display of Foo: 
    ... 

puntos de observación pueden ser realmente útil también, pero puede ralentizar mucho su programa. Estos rompen el flujo cuando el valor de una variable o dirección cambia .:

gdb> watch foo 
Watchpoint4: foo 
gdb> 
+0

¿Por qué no simplemente "p my_struct", en lugar de "p show_my_struct (my_struct)"? – sigjuice

+0

Como puede decodificar el campo de indicadores, ejecutar código de validación, etc. No es simplemente un vuelco de los valores de la estructura, sino que puede volcar el significado, incluidos los objetos relevantes a los que se apunta. Por ejemplo, si obj1 tiene una lista de obj2s, entonces puede anidar un espectáculo de todos los obj2s allí. –

3

Algunos consejos:

  • utilizar una interfaz gráfica (KDbg es bastante bueno, ddd es al menos mejor que la línea de comandos gdb, kdevelop tiene una interfaz agradable gdb pero tiene algunos bgs, nemiver se ve muy bien también, pero todavía está en proceso)
  • asegúrese de tener símbolos de depuración y código fuente para todas las partes importantes (su propio código y también algún sistema libs)
    • en RedHat, puede instalar los paquetes -debuginfo para hacer que los símbolos y el código fuente aparezcan mágicamente en el depurador - realmente genial porque puede examinar las llamadas a funciones libc, etc.
    • en Debian/Ubuntu, puede instalar el - paquetes dbg para obtener símbolos; instalar archivos fuente apropiados para paquetes del sistema parece ser difícil, aunque
  • Tiendo a agregar llamadas assert() y abort() en lugares que no deben ser alcanzados, o en lugares que quiero estudiar (algún tipo de punto de corte de peso pesado)
  • idealmente, las llamadas assert() o abortar() deben estar envueltas en algún método o macro que solo las habilite en versiones de depuración, o mejor aún que solo las habilite si se establece un determinado env var
  • instale un manejador de señal para SIGSEGV y SIGABRT; personalmente, compruebo si se ha establecido una cierta env var antes de instalar los controladores; y en el controlador ejecuto un comando externo codificado que generalmente vive en algún lugar en ~/.local/bin /; ese comando podría entonces iniciar kdbg y adjuntarlo a la aplicación de bloqueo. Voila, el depurador aparece en el momento en que tu aplicación hace algo malo.
  • Si usa pruebas unitarias, puede adjuntar un depurador de manera similar cada vez que falla un caso de prueba, luego inspeccionar la aplicación.
+0

En realidad, afirma que normalmente se eliminan al construir sin depuración (-g). De ASSERT (3): "Si el macro NDEBUG se definió en el momento en que se incluyó por última vez , la macro assert() no genera código y, por lo tanto, no hace nada". –

+0

No estoy seguro de que llamaría eso "normalmente". Por lo general, guardo mis afirmaciones, y también creo que el hecho de que tenga que usar la macro NDEBUG (en oposición a, por ejemplo, no definir una macro "DEPURAR") insinúa que los diseñadores de afirmación acordaron que las afirmaciones generalmente deberían mantenerse. –

0

Utilice ddd, un front-end visual para gdb. Te permite hacer las cosas fácilmente con unos pocos clics del mouse y visualizar cómo funciona el código, además en la consola del depurador tienes un gdb intercativo.

2

Una característica particularmente útil de gdb es su capacidad para inspeccionar el estado final de un programa que se ha bloqueado.

inspeccionar un volcado (o el archivo principal, como se le denomina más comúnmente), comenzar GDB de la siguiente manera:

GDB < nombre-programa > < núcleo-archivo >

Por ejemplo:

gdb a.out núcleo

Al runn ing este comando en un archivo de memoria, gdb le dirá cómo termina el programa y mostrar en qué parte del programa se produjo el error:

Program terminated with signal 11, Segmentation fault. 
#0 0x08048364 in foo() at foo.c:4 
4   *x = 100; 

En el ejemplo anterior, se puede ver que el programa termina con un tiempo fallo de segmentación tratando de asignar un valor a un puntero. Escribiendo traza (o bt o donde) en el indicador del BGF, puede ver traza completa del programa:

(gdb) backtrace 
#0 0x08048364 in foo() at foo.c:4 
#1 0x0804837f in main() at foo.c:9 

En este punto, usted sabe que main() llamados foo() y foo() se estrelló en la línea 4 al intentar asignar un valor a *x. Muchas veces, esto proporciona suficiente información para permitirle corregir el error.

1

Hago un montón de desarrollo paralelo de programas, así que he encontrado que usar un envoltorio simple en python/ruby ​​que me permite tener gdb conectado a todos los procesos en todos los nodos y comunicarme es extraordinariamente útil (no he encontrado una mejor manera si alguien sabe de uno, no para secuestrar el hilo, aunque ...)

no estoy seguro de cómo experimentó la OP es, por lo que:

los documentos son GDB bastante agradable y todo lo abarca. El primer capítulo es una buena introducción a todos los conceptos básicos.

http://www.gnu.org/software/gdb/documentation/

Aunque no GDB, que están relacionados: Personalmente he encontrado que la ruptura de líneas complejas abajo para ayudar en la determinación de qué declaraciones se erroring ayuda.

Además, Valgrind (http://valgrind.org/) es muy agradable/muy útil para hacer frente a tampón-desbordamientos y similares (no he tenido suerte con el BGF para hacer esto

1

básico pero muy útil -. Use la text gui con el opción -tui .

+1

Puede activar el modo gdb tui usando el CTRL-X CTRL-A – ciceron

Cuestiones relacionadas