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