2012-04-03 15 views
47

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.

Odpowiedz

57

Myślę, że wersja libc z symbolami debugowania znajduje się w/usr/lib/debug/lib. Próbowałem ustawić moją zmienną LD_LIBRARY_PATH, aby była na początku ścieżki, ale to nie miało znaczenia.

To są nie droidów, których szukasz.

Biblioteki w katalogu/usr/lib/debug nie są bibliotekami rzeczywistych. Zamiast tego zawierają informacje debugowania, ale nie zawierają .text ani .data sekcji rzeczywistego libc.so.6. Możesz przeczytać o osobnych plikach debuginfo here.

Pliki w /usr/lib/debuglibc6-dbg pochodzą z opakowania i GDB będzie automatycznie załadować je, o ile są one zgodne zainstalowanego libc6 wersję. Jeśli twoje libc6 i libc6-dbg nie pasują, powinieneś otrzymać ostrzeżenie od GDB.

Możesz obserwować pliki, które GDB próbuje odczytać, ustawiając set verbose on. Oto, co trzeba zobaczyć podczas libc6 i libc6-dbg zrobić mecz:

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

Aktualizacja:

Na przykład widzę
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

To implikuje, że GDB nie szuka /usr/lib/debug . Jednym ze sposobów, który może się zdarzyć, jest niepoprawne ustawienie debug-file-directory w twoim .gdbinit.

Oto domyślne ustawienie:

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

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

+3

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

+0

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

13

Upewnij się, że masz zainstalowane symbole debugowania dla libc:

sudo apt-get install libc6-dbg 

A jeśli jesteś na x64 systemu debugowania kodu x86:

sudo apt-get install libc6:i386 
sudo apt-get install libc6-dbg:i386 
Powiązane problemy