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:
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.
objdump -g
bana 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 -a
daha kullanışlı görünüyor.
Ö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 -g
seçenekle veya seçeneksiz olarak oluşturulup oluşturulmadığı önemli değil
-g
Kullanı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-dump
yerine seçenek için gerekli bulacağınız değeri geçebilirsiniz decodedline
.
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.
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.
nm -a
nm --debug-syms
kendini açıklayan bir takma ada sahiptir :-).
diff <(nm <lib>) <(nm -a <lib>)
kolay bir diff almak için
OSX'te dsymutil -s
ve kullanabilirsiniz dwarfdump
.
Kullanılması dsymutil -s <lib_file> | more
hata ayıklama sembolleri var dosyalarda kaynak dosya yollarını göreceksiniz, ama aksi yalnızca işlev adları.
dsymutil -s
misiniz? Çıktının varlığı, hata ayıklama sembolleriyle oluşturulduğu anlamına mı geliyor yoksa greplenmeli mi?
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 --debugging
veya 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 .
obdjump -W lib
ve vardırreadelf -w lib
. İkincisi daha yapılandırılabilir - bkz. Readelf (1) kılavuz sayfası.