Bir kütüphanenin -g ile derlendiğini nasıl anlarım?


105

X86 Linux üzerinde bazı derlenmiş kitaplıklarım var ve bunların hata ayıklama sembolleriyle derlenip derlenmediğini hızlıca belirlemek istiyorum.

Yanıtlar:


86

Linux üzerinde çalışıyorsanız, kullanın objdump --debugging. Kütüphanedeki her nesne dosyası için bir giriş olmalıdır. Hata ayıklama sembollerine sahip olmayan nesne dosyaları için aşağıdaki gibi bir şey göreceksiniz:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

Hata ayıklama sembolleri varsa, çıktı çok daha ayrıntılı olacaktır.


5
Ayrıca obdjump -W libve vardır readelf -w lib. İkincisi daha yapılandırılabilir - bkz. Readelf (1) kılavuz sayfası.
przemoc

3
Herhangi bir ikili dosya için (-g ile derlenenler dahil) objdump bana -gstabs ile derlemediğim sürece "tanınan hata ayıklama bilgisi yok" cevabını veriyor. Bu, bilinen bir hata gibi görünüyor.
Dan Hook

Dan, bunu hangi platformda denedin?
swegi

Kullanılan Rusça: man objdump (1) 'den --debugging bayrağı "dosyada depolanan STABS ve IEEE hata ayıklama formatı bilgilerini ayrıştırmaya ve C benzeri bir sözdizimi kullanarak yazdırmaya çalışır. Bu formatlardan hiçbiri bulunmazsa bu seçenek geri döner Dosyadaki herhangi bir DWARF bilgisini yazdırmak için -W seçeneğinde. "
Matt McClellan

5
objdump -gbana basit bir test için hiçbir şey vermiyor g. o hem ile hem de olmadan derlendi , bu da onu etkili bir şekilde yararsız hale getirdi. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -adaha kullanışlı görünüyor.
jw013

89

Önerilen komut

objdump --debugging libinspected.a
objdump --debugging libinspected.so

bana en azından Ubuntu / Linaro 4.5.2'de her zaman aynı sonucu veriyor:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

arşiv / paylaşılan kitaplığın -gseçenekle veya seçeneksiz olarak oluşturulup oluşturulmadığı önemli değil

-gKullanılıp kullanılmadığını belirlememe gerçekten yardımcı olan şey, kendi kendine okuma aracı:

readelf --debug-dump=decodedline libinspected.so

veya

readelf --debug-dump=line libinspected.so

Bu, kaynak dosya adı, satır numarası ve adresten oluşan bir dizi satırı yazdırır, eğer bu tür hata ayıklama bilgileri kitaplığa dahil edilirse , aksi takdirde hiçbir şey yazdırmaz .

Bunun --debug-dumpyerine seçenek için gerekli bulacağınız değeri geçebilirsiniz decodedline.


1
Mükemmel çalışıyor. Bu komutu çalıştırılabilir dosyamda ilk CMAKE_BUILD_TYPE RELEASE ile denedim ve komut boş döndü. Sonra CMAKE_BUILD_TYPE DEBUG ile denedim ve oldukça fazla çıktı vardı.
infoclog

35

Yardımı:

gdb mylib.so

Hata ayıklama sembolleri bulunamadığında yazdırılır:

Reading symbols from mylib.so...(no debugging symbols found)...done.

Veya bulunduğunda:

Reading symbols from mylib.so...done.

Önceki yanıtların hiçbiri benim için anlamlı sonuçlar vermiyordu: hata ayıklama sembolleri olmayan kitaplıklar çok fazla çıktı veriyordu, vb.


Teşekkürler! Bu benim için çalıştı, Android'de cmake :) ile clang derleyicisini kullanarak
Pär Nils Amsen

hızlı bir kontrol için süper harika! ayrıca * .o nesne dosyalarında da çalışır.
Stephane Rolland

28

nm -a <lib> hata ayıklama dahil olmak üzere kitaplıktaki tüm sembolleri yazdırır.

Eğer çıktılarını karşılaştırabilirsiniz Yani nm <lib>ve nm -a <lib>- şayet farklı ise, sizin lib bazı hata ayıklama simgeleri içerir.


3
@ Employed Russian Bu konuyu biraz daha açabilir misiniz? Neden bunun yanlış bir araç olduğunu düşünüyorsunuz? İşi yapıyor ve bunu Linux'ta da yapıyor.
qrdl

Çekirdek 2.6.35 tabanlı gömülü linux için bile, xxx-objdump, xxx-nm iyi çalışıyor.
agfe2

nm -anm --debug-symskendini açıklayan bir takma ada sahiptir :-).
pevik

3
Sadece yazın diff <(nm <lib>) <(nm -a <lib>)kolay bir diff almak için
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

OSX'te dsymutil -sve kullanabilirsiniz dwarfdump.

Kullanılması dsymutil -s <lib_file> | morehata ayıklama sembolleri var dosyalarda kaynak dosya yollarını göreceksiniz, ama aksi yalnızca işlev adları.


11
Örneğin, çıktıda neye bakmanız gerektiğine dair bir detay verebilir dsymutil -smisiniz? Çıktının varlığı, hata ayıklama sembolleriyle oluşturulduğu anlamına mı geliyor yoksa greplenmeli mi?
Mitch

12

Bunun için objdump kullanabilirsiniz .

DÜZENLEME: Man sayfasından:

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

6

Hata ayıklama bilgilerinin ikiliden ayrı bir dosyada saklanması durumunda, yani ikili dosyanın bir hata ayıklama bağlantısı bölümü içermesi durumunda kullanılmasını objdump --debuggingveya readelf --debug-dump=...çalışmadığını gösteren yanıtlar . Belki biri buna bir böcek diyebilir .readelf

Aşağıdaki kod bunu doğru bir şekilde ele almalıdır:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

Daha fazla bilgi için GDB kılavuzundaki Ayrı Hata Ayıklama Dosyaları bölümüne bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.