Version courte de la question: Comment puis-je faire en sorte que gdb utilise les symboles de débogage pour libc?
Version plus longue: Je débogue un programme avec gdb et je veux voir des informations sur un futex utilisé par libc. Cependant, à un moment donné pendant le débogage, j'obtiens une sortie telle que:
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
....
Quand je lance info sharedlibrary
dans gdb au point d'arrêt je vois:
(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.
Et quand je lance ldd
je vois:
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)
J'utilise Ubuntu 10.04 et je pense que la version de libc avec des symboles de débogage est en /usr/lib/debug/lib
. J'ai essayé de régler mon LD_LIBRARY_PATH
variable pour l'avoir à l'avant du chemin mais cela ne semble pas faire de différence.
Je ne suis pas tout à fait clair sur la façon dont le programme choisit les bibliothèques partagées à charger, que ce soit défini au moment de l'exécution ou de la compilation (je sorte de l'exécution supposée mais maintenant je ne suis pas sûr). Donc, des informations sur la façon d'utiliser gdb pour utiliser la version de débogage de libc sont appréciées.
Je pense que la version de libc avec des symboles de débogage se trouve dans/usr/lib/debug/lib. J'ai essayé de définir ma variable LD_LIBRARY_PATH pour l'avoir à l'avant du chemin, mais cela ne semble pas faire de différence.
Ce ne sont pas pas les droïdes que vous recherchez.
Les bibliothèques de/usr/lib/debug ne sont pas de vraies bibliothèques. Au contraire, les informations de débogage contiennent uniquement , mais ne contiennent pas les sections .text
Ni .data
Des vrais libc.so.6
. Vous pouvez lire sur les fichiers debuginfo séparés ici .
Les fichiers dans /usr/lib/debug
Proviennent du package libc6-dbg
, Et GDB les chargera automatiquement , tant qu'ils correspondent à votre version libc6
installée. Si vos libc6
Et libc6-dbg
Ne correspondent pas, vous devriez recevoir un avertissement de GDB.
Vous pouvez observer les fichiers que GDB tente de lire en définissant set verbose on
. Voici ce que vous devriez voir lorsque libc6
Et libc6-dbg
Correspondent:
(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 ...
Mise à jour:
Par exemple, je vois
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done
Cela implique que votre GDB ne recherche pas /usr/lib/debug
. Une façon qui pourrait se produire si vous définissez debug-file-directory
Dans votre .gdbinit
De manière incorrecte.
Voici le paramètre par défaut:
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".
Assurez-vous d'avoir installé les symboles de débogage pour libc:
Sudo apt-get install libc6-dbg
Et si vous êtes sur un système x64 déboguant du code x86:
Sudo apt-get install libc6:i386
Sudo apt-get install libc6-dbg:i386