Skrócona wersja pytania: Jak mogę uzyskać, aby gdb korzystało z symboli debugowania dla biblioteki libc?Jak korzystać z wersji debugowania biblioteki libc
Dłuższa wersja: Jestem debugowania programu z gdb i chcę zobaczyć informacje o futex używane przez libc. Jednak w pewnym momencie podczas debugowania mam wyjścia, takie jak:
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
....
Kiedy biegnę info sharedlibrary
w gdb przy zerwaniu widzę:
(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.
A kiedy biegnę ldd
widzę:
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)
Używam Ubuntu 10.04 i myślę, że wersja libc z symbolami debugowania jest w /usr/lib/debug/lib
. Próbowałem ustawić zmienną LD_LIBRARY_PATH
tak, aby znajdowała się ona na początku ścieżki, ale to nie miało znaczenia.
Nie jestem całkowicie pewien, w jaki sposób program wybiera, które biblioteki współużytkowane należy załadować, niezależnie od tego, czy jest to ustawione w czasie wykonywania, czy w czasie kompilacji (w pewnym sensie zakładam środowisko uruchomieniowe, ale teraz nie jestem pewien). Dlatego warto docenić informacje o tym, jak zdobyć gdb do korzystania z debugowej wersji libc.
dzięki za odpowiedź na moje pytanie. Wygląda na to, że mam inny problem, ponieważ gdy włączam pełne wyjście, nie widzę gdb szukającego '/ usr/lib/debug' dla symboli dla libc. Na przykład widzę "Odczyt symboli z /lib/libc.so.6...(nie znalezione symbole debugowania) ... wykonane." Więc nadal mam problem, ale twoja odpowiedź jest bardzo pomocna dla zrozumienia, co prawdziwym problemem jest. –
dzięki za aktualizację. Pobrałem i zainstalowałem gdb 7.4 ze źródła w moim katalogu domowym, ponieważ zawierało poprawkę, która rozwiązała problem, który miałem z gdb 7.1, ale nie mam uprawnień do aktualizacji wersji gdb w moim systemie. W każdym razie "katalog debug-files" nie został ustawiony poprawnie, ale ustawienie go poprawnie w '.gdbinit' wydaje się naprawić problem. –
Aby przejść do funkcji libc w gdb, należy pobrać kod źródłowy glibc i rozpakować go. Następnie uruchom polecenie gdb 'directory' ze ścieżką do źródła. Jeśli używasz dystrybucji, która łata bibliotekę libc (taką jak Debian), upewnij się, że zastosowałeś te same łatki (na przykład uruchamiając 'debuild'), w przeciwnym razie numery linii źródłowych mogą się nie zgadzać. –