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
$
¿Quieres decir que gdb no se puede utilizar para depurar el programa arbitary? – user198729
@ 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. –
@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