2011-03-09 14 views
26
GNU gdb Fedora (6.8-37.el5) 
Kernal 2.6.18-164.el5 

Estoy intentando depurar mi aplicación. Sin embargo, cada vez que paso por el binario para el BGF que dice:no se encontraron símbolos de depuración al usar gdb

(no debugging symbols found) 

Aquí está la salida del archivo del binario, y como se puede ver que no es despojado:

vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 

Estoy compilando con los siguientes CFLAGS:

CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code 

¿Alguien me puede decir si me falta algo simple aquí?

Muchas gracias de antemano,

Respuesta

13

Algunas distribuciones de Linux no utilizan los símbolos de depuración gdb estilo. (IIRC prefieren dwarf2.)

En general, gcc y gdb estarán sincronizados en cuanto a qué tipo de símbolos de depuración que utilizan, y obligando a un estilo particular se acaba de causar problemas; a menos que sepa que necesita algo más, use solo -g.

+2

Hola, he cometido un error, estaba compilando con g ++. Sin embargo, he cambiado a la opción de depuración -g. Sin embargo, aún no puede cargar símbolos. Gracias. – ant2009

+0

¿'nm -a -C' en su programa muestra símbolos de depuración? ¿Qué tal 'objdump -g -C'? Intente reemplazar '-g' con -G' o' -W' en este último. – geekosaur

+2

No hay símbolos de depuración de "estilo gdb".GDB usa el formato de depuración estándar de la plataforma, que en Linux es enano {2,3,4}. –

24

La aplicación debe compilarse y vincularse con la opción -g. Es decir. necesita poner -g tanto en CPPFLAGS como en LDFLAGS.

+3

Algunos sistemas operativos requieren -g en tiempo de enlace, pero Linux no es uno de ellos. Compilar con '-g' y vincular sin él todavía produce un archivo ejecutable con información completa de depuración, por lo que es poco probable que esta respuesta sea correcta. –

+0

@EmployedRussian Tienes razón. Sin embargo, sugiero evitar hacer accesos directos no portátiles sin una buena razón. Se mantiene el comportamiento documentado, no documentado, es un riesgo que usted toma. Y no veo ninguna recompensa por el riesgo aquí. Agregar '-g' a los indicadores del vinculador debería costarle cerca de 0, pero podría ahorrarle un día. –

+0

¡Nunca hubiera imaginado que necesitaba estar en LDFLAGS! – MrPickles

37

La causa más frecuente de "no hay símbolos de depuración encontrado" al -g está presente es que hay una cierta discusión "perdida" o -s-S en algún lugar de la línea de enlace.

De man ld:

-s 
    --strip-all 
     Omit all symbol information from the output file. 

    -S 
    --strip-debug 
     Omit debugger symbol information (but not all symbols) from the output file. 
+1

¡Gracias, esto me ayuda a depurar el Lua! Aunque puse la opción -g en el archivo MAKE, también hay una opción -s, lo que hace que el gdb no pueda encontrar símbolos. –

+0

Otra causa frecuente de "ningún símbole de depuración encontrado" cuando -g está presente está escribiendo mal CFLAGS como CFLAGES. Al menos era común para mí hoy. – labyrinth

3

Reemplazar -ggdb con -g y asegurarse de que no está quitando el binario con el comando tira.

4

¡También debería probar -ggdb en lugar de -g si está compilando para Android!

+0

Esto pareció hacer el truco para mi Raspberry Pi 3 (corriendo Raspian) también. – thomthom

2

Sé que esto fue respondido hace mucho tiempo, pero recientemente pasé horas tratando de resolver un problema similar. La configuración es una PC local ejecutando Debian 8 utilizando Eclipse CDT Neon.2, una placa remota ARM7 (Olimex) ejecutando Debian 7. La cadena de herramientas es Linaro 4.9 usando gdbserver en la placa remota y Linaro GDB en la PC local. Mi problema era que la sesión de depuración comenzaba y el programa se ejecutaba, pero los puntos de interrupción no funcionaban y cuando se detenía manualmente "no se podía encontrar una fuente". Mi compilación de opciones de línea (Linaro gcc) incluía -ggdb -O0 como muchos han sugerido, pero sigue siendo el mismo problema. Finalmente probé gdb propiamente en el tablero remoto y no me quejaba de ningún símbolo. Lo curioso fue que la depuración informada de 'archivo' no se eliminó en el ejecutable de destino.

Finalmente resolví el problema agregando -g a las opciones del enlazador. No afirmaré que entiendo completamente por qué esto me ayudó, pero quería pasar esto a otros por si acaso me ayuda. En este caso, Linux realmente necesitaba -g en las opciones del enlazador.

Cuestiones relacionadas