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 -gnie 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 -awydaje 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 -gopcją czy bez niej
To, co naprawdę pomogło mi ustalić, czy -gzostał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-dumpopcji 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 -ama alias, nm --debug-symsktóry jest oczywisty :-).
diff <(nm <lib>) <(nm -a <lib>)aby uzyskać łatwą
Na OSX możesz używać dsymutil -si dwarfdump.
Użycie dsymutil -s <lib_file> | morespowoduje 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 --debugginglub 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 libireadelf -w lib. Ten ostatni jest bardziej konfigurowalny - zobacz stronę podręcznika readelf (1).