Jawaban:
Jika Anda menjalankan di Linux, gunakan objdump --debugging
. Harus ada entri untuk setiap file objek di perpustakaan. Untuk file objek tanpa simbol debugging, Anda akan melihat sesuatu seperti:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Jika ada simbol debugging, hasilnya akan jauh lebih bertele-tele.
objdump -g
tidak memberi saya apa-apa untuk tes sederhana.o dikompilasi dengan dan tanpa g
, membuatnya tidak berguna secara efektif. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -a
sepertinya lebih berguna.
Perintah yang disarankan
objdump --debugging libinspected.a
objdump --debugging libinspected.so
memberi saya hasil yang selalu sama setidaknya di Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
tidak peduli apakah arsip / perpustakaan bersama dibuat dengan atau tanpa -g
opsi
Yang sangat membantu saya untuk menentukan apakah -g
digunakan adalah alat readelf :
readelf --debug-dump=decodedline libinspected.so
atau
readelf --debug-dump=line libinspected.so
Ini akan mencetak serangkaian baris yang terdiri dari nama file sumber, nomor baris dan alamat jika info debug tersebut dimasukkan ke dalam perpustakaan , jika tidak maka tidak akan mencetak apa pun .
Anda dapat memberikan nilai apa pun yang menurut Anda diperlukan untuk --debug-dump
opsi, bukan decodedline
.
Yang membantu adalah:
gdb mylib.so
Ini mencetak ketika simbol debug tidak ditemukan:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Atau saat ditemukan:
Reading symbols from mylib.so...done.
Tak satu pun dari jawaban sebelumnya memberikan hasil yang berarti bagi saya: libs tanpa simbol debug memberikan banyak keluaran, dll.
nm -a <lib>
akan mencetak semua simbol dari perpustakaan, termasuk yang debug.
Jadi, Anda dapat membandingkan output dari nm <lib>
dan nm -a <lib>
- jika berbeda, lib Anda berisi beberapa simbol debug.
nm -a
memiliki alias nm --debug-syms
yang cukup jelas :-).
diff <(nm <lib>) <(nm -a <lib>)
untuk mendapatkan perbedaan yang mudah
Di OSX, Anda dapat menggunakan dsymutil -s
dan dwarfdump
.
Menggunakan dsymutil -s <lib_file> | more
Anda akan melihat jalur file sumber dalam file yang memiliki simbol debug, tetapi hanya nama fungsi yang sebaliknya.
dsymutil -s
,? Apakah keberadaan output berarti bahwa itu dibangun dengan simbol debug, atau haruskah itu di-grep?
Jawaban yang menyarankan penggunaan objdump --debugging
atau readelf --debug-dump=...
tidak berfungsi jika informasi debug disimpan dalam file yang terpisah dari biner, yaitu biner berisi bagian tautan debug . Mungkin orang bisa menyebutnya sebagai bug readelf
.
Kode berikut harus menangani ini dengan benar:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Lihat File Debug Terpisah di manual GDB untuk informasi lebih lanjut.
obdjump -W lib
danreadelf -w lib
. Yang terakhir lebih dapat dikonfigurasi - lihat halaman manual readelf (1).