Wie die debug-version der libc
Kurze version der Frage:
Wie bekomme ich den gdb dazu verwenden Sie die debugging-Symbole für libc?
Längere version:
Ich bin debugging ein Programm mit gdb, und ich möchte, um zu sehen, Informationen über ein futex verwendet libc. Aber irgendwann beim Debuggen bekomme ich die Ausgabe 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
....
Wenn ich info sharedlibrary
im gdb am Haltepunkt 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 laufen ldd
ich sehe:
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 bin mit Ubuntu 10.04, und ich denke, dass die version der libc mit debug-Symbolen ist in /usr/lib/debug/lib
. Ich habe versucht, meine LD_LIBRARY_PATH
variable, um diese an der Vorderseite des Weges, aber das scheint nicht, einen Unterschied zu machen.
Ich bin mir nicht ganz klar, wie das Programm wählt die shared libraries zu laden, ob sich das zur Laufzeit oder compile-Zeit (die ich irgendwie davon ausgegangen, Laufzeit, aber ich bin mir jetzt nicht sicher). So Informationen, wie Sie gdb verwenden Sie die debug-version der libc wird geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese sind nicht die Droiden, die Sie suchen.
Den Bibliotheken in /usr/lib/debug nicht real Bibliotheken. Vielmehr enthalten nur debug info, aber nicht enthalten
.text
noch.data
Abschnitte des realenlibc.so.6
. Lesen Sie dazu die separate debuginfo-Dateien hier.Dateien in
/usr/lib/debug
kommen auslibc6-dbg
Paket und GDB laden Sie automatisch, so lange bis Sie mit Ihrer installiertenlibc6
version. Wenn Ihrlibc6
undlibc6-dbg
nicht übereinstimmen, sollten Sie eine Warnung erhalten vom GDB.Können Sie beobachten, die Dateien GDB ist zu Lesen versuchte, durch Einstellung
set verbose on
. Hier ist, was Sie sehen soll, wennlibc6
undlibc6-dbg
übereinstimmen:Update:
Dass bedeutet, dass dein GDB ist nicht auf der Suche nach
/usr/lib/debug
. Eine Möglichkeit, die passieren könnte, ist, wenn Siedebug-file-directory
in Ihrem.gdbinit
falsch.Hier ist die Standardeinstellung:
/usr/lib/debug
für die Symbole für die libc. Zum Beispiel sehe ichReading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
So ich habe noch ein problem, aber deine Antwort ist sehr hilfreich für das Verständnis, was das eigentliche problem ist.debug-files-directory
war nicht richtig eingestellt aber die Einstellung richtig im.gdbinit
scheint das problem zu beheben.directory
Befehl mit dem Pfad zu der Quelle. Wenn Sie eine Distribution, patches libc (z.B. Debian), dann achten Sie darauf, gelten die gleichen patches (wie z.B. durch ausführendebuild
), sonst die Quelle Zeilennummern Majn nicht übereinstimmen.Stellen Sie sicher, dass Sie installiert haben, die debug-Symbole für libc:
Und wenn Sie auf einem x64-system debugging-x86-code: