Mam kilka skompilowanych bibliotek na Linuksie x86 i chcę szybko ustalić, czy zostały skompilowane z symbolami debugowania.
c
debugging
gdb
debug-symbols
Dan Hook
źródło
źródło
obdjump -W lib
ireadelf -w lib
. Ten ostatni jest bardziej konfigurowalny - zobacz stronę podręcznika readelf (1).objdump -g
nie daje mi nic do prostego testu. o skompilowane zarówno z, jak i bezg
, co skutecznie czyni go bezużytecznym. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22.nm -a
wydaje się być bardziej przydatne.Sugerowane polecenie
daje mi zawsze ten sam wynik, przynajmniej na Ubuntu / Linaro 4.5.2:
bez względu na to, czy archiwum / biblioteka współdzielona została zbudowana z
-g
opcją czy bez niejTo, co naprawdę pomogło mi ustalić, czy
-g
zostało użyte, to narzędzie readelf :lub
To wypisze zestaw linii składający się z nazwy pliku źródłowego, numeru linii i adresu, jeśli takie informacje debugowania są zawarte w bibliotece , w przeciwnym razie nic nie wydrukuje .
Możesz przekazać dowolną wartość, którą uznasz za niezbędną dla
--debug-dump
opcji zamiastdecodedline
.źródło
Pomogło to:
Wyświetla się, gdy nie znaleziono symboli debugowania:
Lub po znalezieniu:
Żadna z wcześniejszych odpowiedzi nie dawała miarodajnych wyników: biblioteki bez symboli debugowania dawały dużo danych wyjściowych itp.
źródło
nm -a <lib>
wypisze wszystkie symbole z biblioteki, w tym symbole debugowania.Możesz więc porównać wyniki
nm <lib>
inm -a <lib>
- jeśli się różnią, twoja biblioteka zawiera kilka symboli debugowania.źródło
nm -a
ma alias,nm --debug-syms
który jest oczywisty :-).diff <(nm <lib>) <(nm -a <lib>)
aby uzyskać łatwąNa OSX możesz używać
dsymutil -s
idwarfdump
.Użycie
dsymutil -s <lib_file> | more
spowoduje wyświetlenie ścieżek plików źródłowych w plikach, które mają symbole debugowania, ale w przeciwnym razie tylko nazwy funkcji.źródło
dsymutil -s
? Czy istnienie wyjścia oznacza, że zostało ono zbudowane przy użyciu symboli debugowania, czy powinno być grepowane?Możesz do tego użyć objdump .
EDYCJA: Ze strony podręcznika:
źródło
Odpowiedzi sugerujące użycie
objdump --debugging
lubreadelf --debug-dump=...
nie działają w przypadku, gdy informacje debugowania są przechowywane w pliku innym niż plik binarny, tj. Plik binarny zawiera sekcję łącza debugowania . Być może można to nazwać błędemreadelf
.Poniższy kod powinien obsłużyć to poprawnie:
Aby uzyskać więcej informacji, zobacz Oddzielne pliki debugowania w podręczniku GDB.
źródło