2012-04-03 6 views
47

Kurzversion der Frage: Wie kann ich GDB die Debugging-Symbole für libc verwenden?Verwendung der Debug-Version von libc

Längere Version: Ich bin Debuggen ein Programm mit GDB und ich möchte Informationen über ein futex von libc verwendet, um zu sehen. an einem gewissen Punkt während des Debuggen erhalte ich Ausgang jedoch wie:

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

Als ich info sharedlibrary in GDB an der Unterbrechungsstelle laufen sehe ich:

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

Und wenn ich ldd laufen sehe ich:

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) 

Ich benutze Ubuntu 10.04 und ich denke, dass die Version von libc mit Debug-Symbolen in /usr/lib/debug/lib ist. Ich habe versucht, meine LD_LIBRARY_PATH Variable zu setzen, um dies an der Vorderseite des Pfades zu haben, aber das schien keinen Unterschied zu machen.

Ich bin nicht ganz klar darüber, wie das Programm wählt, welche gemeinsam genutzten Bibliotheken geladen werden, ob diese zur Laufzeit oder zur Kompilierzeit gesetzt wird (ich nehme die Laufzeit an, aber jetzt bin ich mir nicht sicher). Informationen darüber, wie gdb dazu gebracht werden kann, die Debug-Version von libc zu verwenden, sind willkommen.

Antwort

57

Ich denke, dass die Version von libc mit Debug-Symbolen in/usr/lib/debug/lib ist. Ich habe versucht, meine LD_LIBRARY_PATH-Variable zu setzen, um diese am Anfang des Pfades zu haben, aber das schien keinen Unterschied zu machen.

Dies sind nicht die Droiden, die Sie suchen.

Die Bibliotheken in/usr/lib/debug sind nicht echte Bibliotheken. Eher enthalten die nur Debug-Informationen, aber nicht enthalten .text noch .data Abschnitte der realen libc.so.6. Sie können über die separaten Debuginfo-Dateien here lesen.

Die Dateien in /usr/lib/debug aus libc6-dbg Paket kommen, und GDB wird sie automatisch, so lange laden, wie sie Ihre installierten libc6 Version entsprechen. Wenn Ihre libc6 und libc6-dbg nicht übereinstimmen, sollten Sie eine Warnung von GDB erhalten.

Sie können die Dateien, die GDB zu lesen versucht, beobachten, indem Sie set verbose on einstellen. Hier ist, was Sie sehen sollten, wenn libc6 und libc6-dbg Spiel tun:

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

Update:

Zum Beispiel sehe ich
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

Das bedeutet, dass Ihr GDB nicht /usr/lib/debug sucht . Eine Möglichkeit, die passieren könnte, ist, wenn Sie debug-file-directory in Ihrem .gdbinit falsch einstellen.

Hier ist die Standardeinstellung:

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

danke für die Antwort auf meine Frage. Es sieht so aus, als hätte ich ein anderes Problem, denn wenn ich eine ausführliche Ausgabe einschalte, sehe ich gdb nicht nach '/ usr/lib/debug' für die Symbole für libc. Zum Beispiel sehe ich 'Symbole aus /lib/libc.so.6 lesen ... (keine Debugging-Symbole gefunden) ... fertig. 'Also habe ich noch ein Problem, aber deine Antwort ist sehr hilfreich, um zu verstehen, was echtes Problem ist. –

+3

danke für das Update. Ich hatte gdb 7.4 aus der Quelle in meinem Home-Verzeichnis heruntergeladen und installiert, weil es einen Bugfix hatte, der ein Problem mit gdb 7.1 behob, aber ich habe keine Erlaubnis, die Version von gdb auf meinem System zu aktualisieren. Trotzdem wurde das 'debug-files-directory' nicht richtig gesetzt, aber es scheint das Problem zu beheben, indem man es korrekt in' .gdbinit' gesetzt hat. –

+0

Um libc-Funktionen in gdb zu starten, müssen Sie den glibc-Quellcode herunterladen und entpacken. Führen Sie anschließend den Befehl gdb 'directory' mit dem Pfad zur Quelle aus. Wenn Sie eine Distribution ausführen, die libc (wie Debian) patcht, dann achten Sie darauf, dass Sie die gleichen Patches anwenden (z. B. indem Sie debuild ausführen), sonst stimmen die Zeilennummern möglicherweise nicht überein. –

13

Stellen Sie sicher, die Debug-Symbole für libc installiert haben:

sudo apt-get install libc6-dbg 

Und wenn Sie auf einem x64-System-Debugging x86-Code:

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