2011-06-18 937 views
7

gcc (GCC) 4.6.0 GDB de GNU (GDB) Fedora (7.2.90.20110525-38.fc15)¿Cómo se ven los símbolos de depuración?

Hace poco tuve un problema cuando yo estaba tratando de depurar mi problema usando GDB. Cuando he cargado mi binaria del BGF se quejó de "No hay símbolos de depuración se encontraron"

Así que cuando hice lo siguiente:

nm ass1 

me dio la siguiente salida (sólo de muestra)

00000000006026e0 t __init_array_end 
00000000006026d0 t __init_array_start 
00000000004020e0 T __libc_csu_fini 
0000000000402050 T __libc_csu_init 
       U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 

El problema fue que olvidé agregar la -g. Así que decidí compilar con -g y corrí nm nuevamente. Tengo una salida simliar, este contiene los símbolos de depuración como solía -g, y gdb no se quejó este tiempo:

    U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 
       w pthread_cancel 

Además de ser la más grande en tamaño binario. Pude notar cualquier diferente usando nm. Me pregunto qué debería estar buscando. ¿Cómo se ven los símbolos de depuración?

Muchas gracias por todas las sugerencias,

Respuesta

7

nm oculta los símbolos de depuración por defecto. Use la opción -a para mostrarlos.

Los sistemas modernos a menudo no usan los símbolos de depuración per se. El formato de depuración stabs se desarrolló para su uso con ejecutables de formato a.out, que solo pueden representar una cantidad limitada de estructura interna; esto llevó a ocultar muchas cosas en la tabla de símbolos, como los símbolos de depuración y initializers/constructors. Los formatos de archivo COFF (ahora mayormente obsoletos) y ELF permiten el uso de secciones arbitrarias, y la mayoría de las distribuciones modernas de Linux configuran gcc para usar DWARF 2 información de depuración. Debería poder usar GNU objdump para examinar esa información.

(que no parecen tener acceso a una máquina cuya binutils generará stabs o el formato de GNU stabs+, así que voy a ceder ante Google para los detalles.)

+0

he hecho eso con -a con ambos casos se compilan con y sin -g. Sin embargo, obtengo muchos símbolos, pero ¿cuáles son los depurados? Gracias. – ant2009

+0

Lemme anotar. Puede que no tenga ningún símbolo; Linux a menudo utiliza la información de depuración DWARF 2, que se almacena en diferentes segmentos ELF en lugar de la tabla de símbolos (este último es un remanente del formato limitado 'a.out'). – geekosaur

Cuestiones relacionadas