web-dev-qa-db-fra.com

Comment utiliser la version de débogage de libc

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.

54
Gabriel Southern

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".
69
Employed Russian

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
16
mtlynch