Bagaimana cara mengetahui apakah pustaka dikompilasi dengan -g?

103

Saya memiliki beberapa pustaka terkompilasi di x86 Linux dan saya ingin segera menentukan apakah mereka dikompilasi dengan simbol debugging.

Dan Hook
sumber

Jawaban:

85

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.

Matt McClellan
sumber
5
Ada juga obdjump -W libdan readelf -w lib. Yang terakhir lebih dapat dikonfigurasi - lihat halaman manual readelf (1).
przemoc
3
Untuk biner apa pun, (termasuk yang dikompilasi dengan -g) objdump memberi saya respons "tidak ada informasi debugging yang dikenali" kecuali saya mengkompilasinya dengan -gstabs. Tampaknya ini bug yang dikenali.
Dan Hook
Dan, di platform mana Anda mencoba ini?
swegi
Bahasa Rusia yang digunakan: dari man objdump (1), tanda --debugging "mencoba mengurai informasi format debugging STABS dan IEEE yang disimpan dalam file dan mencetaknya menggunakan sintaks mirip C. Jika format ini tidak ditemukan, opsi ini mundur pada opsi -W untuk mencetak informasi DWARF apa pun di file. "
Matt McClellan
5
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.
jw013
89

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.

Alex InTechno
sumber
1
bekerja dengan sempurna. Saya mencoba perintah ini pada executable saya dengan CMAKE_BUILD_TYPE RELEASE pertama dan perintah kembali kosong. Kemudian saya mencoba dengan CMAKE_BUILD_TYPE DEBUG dan hasilnya cukup banyak.
infoclogged
32

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.

Velkan
sumber
Terima kasih! Ini berhasil untuk saya, menggunakan kompiler clang di Android dengan cmake :)
Pär Nils Amsen
sangat bagus untuk pemeriksaan cepat! juga bekerja pada file objek * .o.
Stephane Rolland
28

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.

qrdl
sumber
3
@Pekerjaan Rusia Bisakah Anda menjelaskan lebih lanjut tentang ini? Menurut Anda mengapa itu adalah alat yang salah? Itu melakukan pekerjaan, dan melakukannya di Linux juga.
qrdl
Bahkan untuk Linux yang tertanam berdasarkan kernel 2.6.35, xxx-objdump, xxx-nm berfungsi dengan baik.
agfe2
nm -amemiliki alias nm --debug-symsyang cukup jelas :-).
pevik
3
Cukup ketik diff <(nm <lib>) <(nm -a <lib>)untuk mendapatkan perbedaan yang mudah
Aᴄʜᴇʀᴏɴғᴀɪʟ
17

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.

glennr
sumber
11
Bisakah Anda memberikan penjelasan tentang apa yang harus dicari dalam output, misalnya dsymutil -s,? Apakah keberadaan output berarti bahwa itu dibangun dengan simbol debug, atau haruskah itu di-grep?
Mitch
12

Anda dapat menggunakan objdump untuk ini.

EDIT: Dari halaman manual:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
swegi
sumber
6

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.

ack
sumber