2010-04-05 26 views

Respuesta

8

Es porque no compilar con la depuración activada. Trate gcc -g file.c

+0

¿Quieres decir que gdb no se puede utilizar para depurar el programa arbitary? – user198729

+2

@ user198729: puede usar GDB para depurar un programa arbitrario, pero debe trabajar mucho más si el programa no tiene una tabla de símbolos. Básicamente, la tabla de símbolos le dice al depurador sobre las funciones y las variables, los números de línea y los archivos fuente, y si falta, todo lo que queda es ensamblador. –

+0

@Jonathan Leffler, parece que quiere decir que todavía es posible depurar el programa incluso si no tiene una tabla de símbolos, ¿puede dar un ejemplo? – user198729

2

La tabla de símbolos contiene información de depuración que le dice a un depurador lo que corresponden a las posiciones de memoria qué símbolos (como los nombres de funciones y nombres de variables) en el archivo de código fuente original. La tabla de símbolos generalmente se almacena dentro del ejecutable, sí.

gdb le dice que no puede encontrar esa tabla. Si compiló con gcc, a menos que haya usado el indicador -g, no incluirá la tabla de símbolos en el archivo. El método más fácil es probablemente recompilar su archivo con -g. gdb debería encontrar automáticamente la información de la tabla de símbolos.

puede añadir el ajuste -g a los argumentos de línea de comandos de gcc o al Makefile que utilizó para compilar el programa. (Muchas veces, habrá una variable llamada CFLAGS o similar dentro del Makefile).

Si usted está tratando de depurar un programa de terceros arbitraria, muchas veces la información habrá sido "despojado" fuera de él. Esto se hace para dificultar la ingeniería inversa y reducir el tamaño del archivo ejecutable. A menos que tenga acceso al código fuente y pueda compilar el programa usted mismo, le será muy difícil usar gdb en él.

+0

¿Por qué algunas otras herramientas como softice pueden depurar el programa arbitrario, no utilizan las mismas técnicas que gdb? – user198729

+0

Aproximadamente las mismas técnicas, sí. Puede hacer cosas similares con gdb, como colocar puntos de interrupción en las llamadas al sistema o examinar el código de ensamblado o mirar los valores de registro o el contenido de direcciones de memoria específicas, incluso sin una tabla de símbolos. También puede consultar strace o ltrace si está en Linux. – RarrRarrRarr

+0

Pero no importa qué comando escriba, gdb siempre responde con 'No se carga ninguna tabla de símbolos. Use el comando "file". Parece imposible depurar un programa sin la tabla de símbolos. ¿O tal vez hay algo que me estoy perdiendo? – user198729

18

Hay dos conjuntos de símbolos que usa gdb.

El conjunto -g son símbolos de depuración, que hacen cosas mucho más fácil, ya que le permiten ver su código y mira a las variables durante la depuración.

Otro conjunto de símbolos se incluye de forma predeterminada al compilar. Estos son los símbolos de enlace y viven en la tabla de símbolos ELF (formato enlazable ejecutable). Esto contiene mucha menos información que los símbolos de depuración, pero contiene las cosas más importantes, como las direcciones de las cosas en su ejecutable (o biblioteca o archivo de objeto). Sin esta información, gdb ni siquiera sabrá dónde está main, por lo que (gdb) break main fallará.

Si no tiene los símbolos de depuración (-g), entonces todavía podrá (gdb) break main pero su gdb no tendrá ningún concepto de las líneas de código en su archivo fuente. Cuando intente recorrer el código, solo avanzará 1 instrucción de máquina a la vez, en lugar de avanzar línea por línea.

El comando tira se utiliza a menudo para strip de símbolos de un ejecutable (u otro archivo de objeto). Esto se usa a menudo si no desea que alguien pueda ver los símbolos o si desea guardar espacio en el archivo. Las tablas de símbolos pueden agrandarse. Strip elimina tanto los símbolos de depuración como los símbolos del enlazador, pero tiene varios modificadores de línea de comandos que pueden limitar lo que elimina.

Si ejecuta el comando file en su programa, una de las cosas que le indicará si el clima es o no el ejecutable ha sido eliminado.

$ gcc my_prog.c -o my_prog 
$ file my_prog 
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 
$ strip my_prog 
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped 
$ 
+0

¿Estás seguro de que los símbolos del enlazador ('.dynsym', ¿verdad?) Se eliminan con' strip'? Según [esto] (http://stackoverflow.com/a/8624223/264047) no lo son. –

+2

'strip' tiene opciones que controlan qué símbolos se eliminan y cuáles no. El comportamiento predeterminado generalmente no rompe las cosas. – nategoose

+0

@nategoose puede decirnos si los símbolos de depuración incluyen o no los símbolos en la tabla de símbolos ELF. En otras palabras, ¿GDB solo usa los símbolos de depuración cuando la aplicación ha sido compilada con -g? –

1

Encuentra el punto de entrada de la aplicación.

objdump -f main 

    main:  file format elf32-i386 
    architecture: i386, flags 0x00000112: 
    EXEC_P, HAS_SYMS, D_PAGED 
    start address 0x08048054 

Ponga un punto de interrupción no utilizar el depurador GNU

gdb 

    exec-file main 
    break *0x8048054 
    set disassemble-next-line on 
    run 

entonces el paso a través del código

gdb 

    stepi 

Notas especiales

Si está utilizando la última versión de Ubuntu no se vería afectado por esto, pero puede encontrarse con este error si está ejecutando Ubuntu 10.04 o r más viejo.

https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/151518G 

La solución sería comenzar a depurar en la dirección del punto de entrada más uno.

Cuestiones relacionadas