Mam kilka skompilowanych bibliotek na Linuksie x86 i chcę szybko ustalić, czy zostały skompilowane z symbolami debugowania.
Odpowiedzi:
Jeśli używasz systemu Linux, użyj objdump --debugging
. Dla każdego pliku obiektowego w bibliotece powinien istnieć wpis. W przypadku plików obiektowych bez symboli debugowania zobaczysz coś takiego:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Jeśli istnieją symbole debugowania, dane wyjściowe będą znacznie bardziej szczegółowe.
objdump -g
nie daje mi nic do prostego testu. o skompilowane zarówno z, jak i bez g
, 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
objdump --debugging libinspected.a
objdump --debugging libinspected.so
daje mi zawsze ten sam wynik, przynajmniej na Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
bez względu na to, czy archiwum / biblioteka współdzielona została zbudowana z -g
opcją czy bez niej
To, co naprawdę pomogło mi ustalić, czy -g
zostało użyte, to narzędzie readelf :
readelf --debug-dump=decodedline libinspected.so
lub
readelf --debug-dump=line libinspected.so
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 zamiast decodedline
.
Pomogło to:
gdb mylib.so
Wyświetla się, gdy nie znaleziono symboli debugowania:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Lub po znalezieniu:
Reading symbols from mylib.so...done.
Żadna z wcześniejszych odpowiedzi nie dawała miarodajnych wyników: biblioteki bez symboli debugowania dawały dużo danych wyjściowych itp.
nm -a <lib>
wypisze wszystkie symbole z biblioteki, w tym symbole debugowania.
Możesz więc porównać wyniki nm <lib>
i nm -a <lib>
- jeśli się różnią, twoja biblioteka zawiera kilka symboli debugowania.
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
i dwarfdump
.
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.
dsymutil -s
? Czy istnienie wyjścia oznacza, że zostało ono zbudowane przy użyciu symboli debugowania, czy powinno być grepowane?
Odpowiedzi sugerujące użycie objdump --debugging
lub readelf --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łędem readelf
.
Poniższy kod powinien obsłużyć to poprawnie:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Aby uzyskać więcej informacji, zobacz Oddzielne pliki debugowania w podręczniku GDB.
obdjump -W lib
ireadelf -w lib
. Ten ostatni jest bardziej konfigurowalny - zobacz stronę podręcznika readelf (1).