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 -gtidak 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 -asepertinya 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 -gopsi
Yang sangat membantu saya untuk menentukan apakah -gdigunakan 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-dumpopsi, 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 -amemiliki alias nm --debug-symsyang cukup jelas :-).
diff <(nm <lib>) <(nm -a <lib>)untuk mendapatkan perbedaan yang mudah
Di OSX, Anda dapat menggunakan dsymutil -sdan dwarfdump.
Menggunakan dsymutil -s <lib_file> | moreAnda 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 --debuggingatau 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 libdanreadelf -w lib. Yang terakhir lebih dapat dikonfigurasi - lihat halaman manual readelf (1).