70 votes

Comment utiliser la version debug 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 suis en train de déboguer 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 cours info sharedlibrary dans gdb au point d'arrêt que 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 cours 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 la libc avec les symboles de débogage est en /usr/lib/debug/lib . J'ai essayé de régler mon LD_LIBRARY_PATH variable de l'avoir à l'avant du chemin mais cela ne semble pas faire de différence.

Je ne sais pas exactement comment le programme choisit les bibliothèques partagées à charger, si cela se fait au moment de l'exécution ou de la compilation (j'ai supposé que c'était au moment de l'exécution, mais je n'en suis plus sûr). Donc toute information sur la façon de faire en sorte que gdb utilise la version de débogage de libc sera appréciée.

82voto

Employed Russian Points 50479

Je pense que la version de libc avec les symboles de débogage se trouve dans /usr/lib/debug/lib. J'ai essayé de configurer ma variable LD_LIBRARY_PATH pour qu'elle soit en tête du chemin, mais cela ne semble pas faire de différence.

Ce sont pas les droïdes que vous recherchez.

Les bibliothèques dans /usr/lib/debug ne sont pas réel bibliothèques. Il s'agit plutôt de contenir uniquement mais ne contiennent pas d'informations de débogage .text ni .data sections du réel libc.so.6 . Vous pouvez vous renseigner sur les fichiers de débogage séparés. ici .

Les fichiers dans /usr/lib/debug proviennent de libc6-dbg et GDB les chargera automatiquement pour autant qu'ils correspondent à votre installation libc6 version. Si votre 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 les paramètres suivants set verbose on . Voici ce que vous devriez voir lorsque libc6 et libc6-dbg correspondre :

(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 cherche pas /usr/lib/debug . Cela peut arriver si vous mettez debug-file-directory dans votre .gdbinit incorrectement.

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

26voto

nonsensical101 Points 752

Assurez-vous que vous avez 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X