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.
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 –
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. –
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. –