Cómo usar la versión de depuración de libc

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

Versión más larga: estoy depurando un progtwig con gdb y quiero ver información sobre un futex utilizado por libc. Sin embargo, en algún momento durante la depuración obtengo resultados 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 ejecuto info sharedlibrary en gdb en el punto de interrupción 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 ejecuto 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 . Intenté configurar mi variable LD_LIBRARY_PATH para tener esto al principio de la ruta, pero eso no pareció marcar la diferencia.

No estoy completamente seguro de cómo el progtwig elige qué bibliotecas compartidas cargar, ya sea que esté configurado en tiempo de ejecución o en tiempo de comstackción (de alguna manera 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.

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 no son los droides que estás buscando.

Las bibliotecas en / usr / lib / debug no son bibliotecas reales . Más bien, contienen solo información de depuración, pero no contienen secciones .text ni .data del libc.so.6 real. Puede leer sobre los archivos de debuginfo separados aquí .

Los archivos en /usr/lib/debug vienen del paquete libc6-dbg , y GDB los cargará automáticamente , siempre y cuando coincidan con su versión de libc6 instalada. Si su libc6 y libc6-dbg no coinciden, debería recibir una advertencia de GDB.

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

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

Actualizar:

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

Eso implica que su GDB no está buscando /usr/lib/debug . Una forma en que podría suceder es si configura el debug-file-directory en su .gdbinit incorrectamente.

Aquí está la configuración predeterminada:

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

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

 sudo apt-get install libc6-dbg 

Y si está en un sistema x64 depurando el código x86:

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