2012-04-03 13 views
47

Versión corta de la pregunta: ¿Cómo puedo obtener gdb para usar los símbolos de depuración para libc? VersiónCómo usar la versión de depuración de libc

más larga: estoy depurando un programa con GDB y yo quiero ver información sobre un futex utilizado por libc. Sin embargo, en algún momento durante la depuración consigo la producción, tales como:

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ??() from /lib/libc.so.6 
(gdb) bt 
#0 0x00007ffff772b73e in ??() from /lib/libc.so.6 
#1 0x00007ffff767fb90 in ??() from /lib/libc.so.6 
#2 0x00007ffff767a4c0 in vfprintf() from /lib/libc.so.6 
#3 0x00007ffff768565a in printf() from /lib/libc.so.6 
.... 

Cuando corro info sharedlibrary en GDB en el punto de interrupción que veo:

(gdb) info sharedlibrary 
From    To     Syms Read Shared Object Library 
0x00007ffff7dddaf0 0x00007ffff7df6704 Yes (*)  /lib64/ld-linux-x86-64.so.2 
0x00007ffff7bc53e0 0x00007ffff7bd1388 Yes (*)  /lib/libpthread.so.0 
0x00007ffff79ba190 0x00007ffff79bd7d8 Yes (*)  /lib/librt.so.1 
0x00007ffff76538c0 0x00007ffff7766c60 Yes (*)  /lib/libc.so.6 
0x00007ffff6c1fd80 0x00007ffff6c303c8 Yes (*)  /lib/libgcc_s.so.1 
(*): Shared library is missing debugging information. 

Y cuando corro ldd veo:

linux-vdso.so.1 => (0x00007ffff7fde000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000) 
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000) 
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000) 
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000) 

Estoy usando Ubuntu 10.04 y creo que la versión de libc con símbolos de depuración está en /usr/lib/debug/lib. Traté de configurar mi variable LD_LIBRARY_PATH para tener esto al principio de la ruta, pero eso no pareció marcar la diferencia.

No tengo completamente claro cómo el programa elige qué bibliotecas compartidas cargar, ya sea que esté configurado en tiempo de ejecución o en tiempo de compilación (en cierto modo asumí el tiempo de ejecución, pero ahora no estoy seguro). Entonces se agradece la información sobre cómo hacer que gdb use la versión de depuración de libc.

Respuesta

57

Creo que la versión de libc con símbolos de depuración está en/usr/lib/debug/lib. Intenté configurar mi variable LD_LIBRARY_PATH para tener esto al principio de la ruta, pero eso no pareció marcar la diferencia.

Estos son no los robots que está buscando.

Las bibliotecas en/usr/lib/debug no son bibliotecas reales. En su lugar, contiene solo información de depuración, pero no contiene .text ni .data secciones de la real libc.so.6. Puede leer sobre los archivos de debuginfo separados here.

Los archivos en /usr/lib/debug provienen de libc6-dbg paquete, y el BGF los cargará automáticamente , siempre que coincida con su versión instalada libc6. Si su libc6 y libc6-dbg no concuerdan, debería recibir una advertencia de GDB.

Puede observar los archivos que GDB intenta leer configurando set verbose on. Esto es lo que debería ver cuando libc6 y libc6-dbg coinciden:

(gdb) set verbose on 
(gdb) run 
thread_db_load_search returning 0 
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done. 
thread_db_load_search returning 0 
done. 
thread_db_load_search returning 0 
Loaded symbols for /lib64/ld-linux-x86-64.so.2 
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done. 
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000. 
thread_db_load_search returning 0 
Reading in symbols for dl-debug.c...done. 
Reading in symbols for rtld.c...done. 
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done. 
thread_db_load_search returning 0 
... etc ... 

Actualización:

Por ejemplo veo
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

Eso implica que el BGF no busca /usr/lib/debug . Una forma de que esto suceda es si configura debug-file-directory incorrectamente en su .gdbinit.

Aquí es el valor predeterminado:

(gdb) show debug-file-directory 
The directory where separate debug symbols are searched for is "/usr/lib/debug". 
+0

gracias por la respuesta a mi pregunta. Parece que tengo otro problema porque cuando enciendo la salida detallada no veo gdb buscando '/ usr/lib/debug' para los símbolos de libc. Por ejemplo, veo 'Lectura de símbolos de /lib/libc.so.6...(no símbolos de depuración encontrados) ... hecho. 'Así que todavía tengo un problema, pero tu respuesta es muy útil para entender qué el verdadero problema es –

+3

gracias por la actualización. Había descargado e instalado gdb 7.4 de la fuente en mi directorio de inicio porque tenía una corrección de errores que resolvía un problema que tenía con gdb 7.1, pero no tengo permiso para actualizar la versión de gdb en mi sistema. De todos modos, 'debug-files-directory' no se configuró correctamente, pero configurarlo' .gdbinit' parece solucionar el problema. –

+0

Además, para acceder a las funciones de libc en gdb, asegúrese de descargar el código fuente de glibc y descomprimirlo. Luego ejecute el comando gdb 'directory' con la ruta a la fuente. Si está ejecutando una distribución que revisa libc (como Debian), asegúrese de aplicar los mismos parches (por ejemplo, ejecutando 'debuild'), de lo contrario, es posible que los números de las líneas de origen no coincidan. –

13

Asegúrese de que ha instalado los símbolos de depuración para libc:

sudo apt-get install libc6-dbg 

Y si estás en un código de depuración del sistema x86 x64:

sudo apt-get install libc6:i386 
sudo apt-get install libc6-dbg:i386 
Cuestiones relacionadas