2015-08-28 28 views
5

Bir yürütülebilir dosya ve bir gcore var.ilişki

Gcore ile temel döküm dosyasını oluşturdum.

Şimdi, yürütülebilir dosyanın sanal adresini çekirdek dökümüne eşlemek istiyorum.

Çekirdek dökümün bir yürütülebilir dosyanın bellek dökümü olduğunu ve eğer sanal adresi çekirdek dökümden analiz etmek istersem biliyorum. Sanal adres 0x0000, çekirdek dökümün 0x0000 ofsetine eşit olduğunu varsayabilir miyim? Ben çekirdek dökümü yürütülebilir dosyasının bir bellek dökümü olduğunu biliyoruz

cevap

3

,

sayılı gdb bir çekirdek dökümü (gcore bunu kullandığınız gösterir) bu yüzden, ELF biçiminde genellikle neyin ne ile eşleştiğini tanımlayan geniş bir başlık var.

GDB/linux adres boşluklarının ne zaman boşa harcanacağını ne kadar iyi kullandığını tam olarak bilmiyorum, ancak dosya ofseti x'in bellek offset x ile eşleneceğini varsaymazsınız - çünkü sanal adres alanı bir büyük olabilir adres alanı, yalnızca birkaç sayfa kullanıyor. (örn. 64 bitlik bir işlem, sabit diskinizden çok daha büyük bir sanal adres alanına sahip olabilirken, yalnızca aslında daha küçük olan belleğe ayrılmış olabilir ve hatta tüm sayfaların aslında ayrılması gerekmez).

Ancak, GDB bu üstbilgileri okuyabilir ve bir şeyler yazdırmasını ister (örneğin, print veya x komutunu kullanarak), size doğru olanı verecektir.

Çekirdek dökümü dosyasını okumak istiyorsanız, bunu yapmak için doğru olan şey GDB'nin yeteneklerini kullanmaktır. Neyse ki, C/C++ uygulamanız için tam olarak bunu yapan libgdb var. Temelde GDB ile konuştuğunuz gibi bir kullanıcı gdb kabuğunun önünde oturuyorsunuz. Bu nedenle, GDB'de istediğiniz şeyi nasıl yapacağınızı öğrenin ve programlı olarak yapmak için libgdb'yi kullanın.

Düşük seviye yapmak istiyorsanız (bunu yapma, bir güçlük ve gerçekten de kullanmak istediğiniz GDB, aslında) çekirdek dökümü ayrıştırmak ve temsil etmek için doğrudan Binary File Descriptor Library kullanabilirsiniz. GDB'nin önemli bir parçası ve çok sayıda GDB rutinini yeniden uygulayamadan kendi C++ programınızla çalışmasını sağlamak zor olacak.

+0

Çekirdek dökümündeki sanal adres verilerini C++ 'dan okumak için herhangi bir yol biliyor musunuz? –

+0

@JohnDoyle: cevabımdaki değişikliği gör. –

+0

Çok teşekkür ederim! sen bir kahramansın! :) –