GDB'nin neden çekirdek dökümü kadar yürütülebilir dosyaya ihtiyacı var?


11

Çekirdek dökümlerini kullanarak hata ayıklama ve gdb, çekirdek dökümü yanı sıra yürütülebilir sağlamak için ihtiyacınız olduğunu unutmayın. Bu neden? Çekirdek dökümü, işlemin kullandığı tüm belleği içeriyorsa, yürütülebilir dosya çekirdek dökümü içinde yer almıyor mu? Belki de tüm exe'nin belleğe yüklendiğinin garantisi yoktur (bireysel yürütülebilir dosyalar genellikle bu kadar büyük değildir) veya belki de çekirdek dökümü sonuçta ilgili tüm belleği içermiyor olabilir? Semboller için mi (belki de normal olarak belleğe yüklenmezler)?


1
Yürütülebilir dosya, gdb belgelerinde belirtildiği gibi sembol bilgilerini içerir ...
Thomas Dickey

1
Şaşırtıcı bir şekilde, (henüz eklediğim hariç) hiçbir cevap DWARF biçiminden bahsediyor
Basile Starynkevitch

Yanıtlar:


15

Çekirdek dökümü, programlarınızın bellek ayak izinin dökümüdür, eğer her şeyin nerede olduğunu biliyorsanız, bunu kullanabilirsiniz.

Yürütülebilir dosyayı kullanırsınız, çünkü (mantıksal adresler açısından) şeylerin bellekte nerede olduğunu, yani çekirdek dosyayı açıklar.

Bir komut kullanırsanız objdump, araştırdığınız yürütülebilir nesne hakkındaki meta verileri atar. Örnek olarak a.out adında yürütülebilir bir nesne kullanma.

objdump -h a.outyalnızca başlık bilgisini döker, ör. .data veya .bss veya .text (daha fazlası var). Bunlar, çekirdek yükleyiciye nesnede çeşitli bölümlerin nerede bulunabileceği ve işlem adres alanında bölümün nereye yükleneceği ve bazı bölümler için (örn. Veri .text) nelerin yüklenmesi gerektiği konusunda bilgi verir. (.bss bölümü dosyada herhangi bir veri içermez, ancak başlatılmamış veriler için ayrılacak bellek miktarını ifade eder, sıfırlarla doldurulur).

Yürütülebilir nesne dosyasının düzeni standart bir ELF'ye uygundur.

objdump -x a.out - her şeyi döker

Yürütülebilir nesne hala sembol tablolarını içeriyorsa (soyulmamışsa - man stripve ac kaynak derlemesini varsaymak -giçin hata ayıklama üretimi oluşturduysanız gcc), temel içeriği sembol adlarıyla inceleyebilirsiniz, örneğin bir değişkeniniz / tamponunuz varsa adlı inputLine kaynak kodunda, sen o ismi kullanabilirsiniz gdbiçeriği bakmak için. ie gdb, inputLine'ın başlatıldığı ve başlatılan değişkenin uzunluğunun programlarınızın başlangıcından sapmasını bilir .

Daha fazla okuma Madde 1 , Madde 2 ve nitrit cesur Yürütülebilir ve Bağlayıcı Biçim (ELF) spesifikasyonu için .


Aşağıdaki mirabilos yorumundan sonra güncelleyin.

Ancak, sembol tablosunu

$ gdb --batch -s a.out -c core -q -ex "x buf1"

üretir

 0x601060 <buf1>:    0x72617453

ve sonra sembol tablosunu kullanmıyor ve adresi doğrudan

$ gdb --batch -c core -q -ex "x 0x601060"

üretir

0x601060:   0x72617453

2. komutta sembol tablosunu kullanmadan doğrudan belleği inceledim.


Ayrıca görüyorum ki, @ user580082'nin yanıtı açıklamalara daha fazla katkıda bulunuyor ve oy verecek.


6
Hiç "temel yığın bölümü" duymadım. .bss (tarihsel olarak) "simgesiyle başlatılan bloktur" ve pratikte "birimleştirilmiş veriler" olurken, .data "başlatılan veriler" ve metin (.code değil) makine kodunu saklamak için kullanılır. Çalışma zamanında yığınlar oluşturulduğundan, bir ikili dosyada yığın bölümü yoktur.
jlliagre

“Her şeyin nerede olduğunu biliyorsanız, bunu kullanabilirsiniz” de doğru değildir çünkü programdaki her şey ayak izine dahil edilmez.
mirabilos

1
@jlliagre doğru, yanlışlıkla .text .code çağırdı (çünkü cevap yazarken bir açıklama düşünüyordum) - güncellendi. Yanlışlıkla bss ismini yanlış düşündüm ve cevabımı güncelledim, ancak kaçındım * Blok Başladı Sembolü ile gerçekten denkleme eklediğini sanmıyorum ve bunun başlatılmamış veri olarak kullanıldığını açıkladık, Genel kanı. Teşekkür ederim - Bu yayını düzeltmek için yorumunuzu takdir ettim.
X Tian

4

Çekirdek dosya, işlem sonlandırılması sırasında yığın görüntüsünün, bellek eşlemelerinin ve kayıtlarının bir anlık görüntüsüdür. İçeriği çekirdek kılavuz sayfasında verildiği gibi değiştirilebilir . Varsayılan olarak özel eşlemeler, paylaşılan eşlemeler ve ELF başlık bilgileri çekirdek dosyaya dökülür.

Sorunuza gelince , gdb'nin çalıştırılabilir olmasını gerektirmesinin nedeni, valgrind gibi ikili talimatları okuyarak ve yorumlayarak yürütmeyi simüle etmemesidir, bunun yerine çalışma sırasında sürecin davranışını kontrol etmek için sürecin üst öğesi olur saati. Kilitleme sırasında bellek eşlemelerini ve işlemcinin işlem durumunu belirlemek için çekirdek dosyayı kullanır.

Linux'ta ebeveyn süreçleri çocukları hakkında ek bilgi alabilir, özellikle de hata ayıklayıcının hafızasını okuma / yazma, kayıtlar, sinyal eşlemelerini değiştirme, yürütmeyi durdurma vb.

Herhangi bir hata ayıklayıcının nasıl çalıştığını okuduğunuzda, çekirdek dosyaya sahip olmanın yürütülebilir denetiminin gerekliliğini anlayacaksınız.


1

(diğer iyi yanıtlara ek olarak)

Modern Linux (ve birçok Unix benzeri) sistemlerde, hata ayıklama bilgileri (sembolün türleri, kaynak kodu konumu, değişkenlerin türü, vb. Hakkında meta veriler dahil) DWARF biçimindedir ve ELF yürütülebilir dosyasının ( veya ELF paylaşılan kütüphaneleri) bir -gseçenekle derlendiğinde . Hata ayıklanacak programların derlenmesini -g3 -O0ve belki de -fno-inlineyeni bir GCC kullanılıyorsa ; Bununla birlikte, GCC ile hem optimizasyon hem de hata ayıklama bilgileriyle, örneğin -O2 -g1hata ayıklama bilgileri bu durumda biraz "bulanık" olsa da derleyebilirsiniz (bu biraz yaramaz Heisenbug'ları yakalamaya yardımcı olabilir ).

Bu bilgileri çekirdek dosyalara koymaktan kaçınmak oldukça mantıklıdır , çünkü coreaynı yürütülebilir dosya için birçok farklı çekirdek dosyaya sahip olabilirsiniz (birçok kullanıcı hata raporları yapan, çoğu dökümü olan yaygın olarak kullanılan bir yazılım hayal edin ). Ayrıca çekirdek (5) dosyaları, elf (5) yürütülebilir dosyalarında DWARF bölümlerinin varlığını önemsememesi gereken çekirdek tarafından dökülür (çünkü bu bölümler, çekirdeğin bazı sinyallere dökülen hata işleminin sanal adres alanına eşlenmediğinden ( 7) ). Hata ayıklama bilgilerinin ayrı dosyalara (yürütülebilir dosyanın dışında) konulması olasılığı bile vardır .

BTW, GDB, herhangi bir hata ayıklama bilgisi olmadan yürütülebilir dosyalar için çekirdek dökümü hatalarını ayıklamak için acıyla kullanılabilir. Ama sonra pratik olarak makine kodu seviyesinde hata ayıklayın (programlama dilleri ve derleyicileri tarafından sağlanan sembolik düzeyde değil).

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.