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.