Jak mogę sprawdzić, czy biblioteka została skompilowana za pomocą opcji-g?
Mam kilka skompilowanych bibliotek na Linuksie x86 i chcę szybko ustalić, czy były one skompilowane z symbolami debugowania.
7 answers
Jeśli używasz Linuksa, użyj objdump --debugging
. Dla każdego pliku Obiektowego w bibliotece powinien znajdować się wpis. Dla plików obiektowych bez debugowania symboli, zobaczysz coś w stylu:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Jeśli istnieją symbole debugowania, wyjście będzie znacznie bardziej wyraziste.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 11:09:45
Sugerowane polecenie
objdump --debugging libinspected.a
objdump --debugging libinspected.so
Daje mi zawsze taki 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 opcją -g
To, co naprawdę pomogło mi ustalić, czy -g
zostało użyte, to readelf Narzędzie:
readelf --debug-dump=decodedline libinspected.so
Lub
readelf --debug-dump=line libinspected.so
To wyświetli zestaw wierszy składający się z nazwy pliku źródłowego, numeru linii i adresu , jeśli takie informacje o debugowaniu są dołączone do biblioteki , w przeciwnym razie wydrukuje nic .
Możesz przekazać dowolną wartość dla --debug-dump
zamiast decodedline
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 14:04:22
nm -a <lib>
wyświetli wszystkie symbole z biblioteki, włącznie z symbolami debugującymi.
Możesz więc porównać wyjścia nm <lib>
i nm -a <lib>
- jeśli różnią się, lib zawiera pewne symbole debugowania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-04 13:56:24
Co pomogło:
gdb mylib.so
Wyświetla, gdy nie znaleziono symboli debugowania:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Lub gdy znaleziono:
Reading symbols from mylib.so...done.
Żadna z wcześniejszych odpowiedzi nie dawała mi znaczących rezultatów: biblioteki bez symboli debugowania dawały dużo wyników, itp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 10:02:29
Na OSX można używać dsymutil -s
i dwarfdump
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 20:41:57
Możesz użyć objdump do tego.
EDIT: From the man-page:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-05 08:09:45
Odpowiedzi sugerujące użycie objdump --debugging
lub readelf --debug-dump=...
nie działają w przypadku, gdy informacje debugowania są przechowywane w pliku oddzielonym od pliku binarnego, tzn. plik binarny zawiera sekcję debug link . Być może można nazwać to błędem w readelf
.
Poniższy kod powinien obsługiwać to poprawnie:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Zobacz oddzielne pliki debugowania w podręczniku GDB, aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 00:48:59