2010-08-27 14 views
7

Aşağıdaki sorunla karşılaşıyorum: backtrace (3) işlevini kullanarak C'de bir backtrace aldığımda, işlevlerin adı döndürülen işlevler cüce kitaplığı ile kolayca belirlenebilir. dladdr (3).Bir C işlevi işaretçisinin işlev adı nasıl elde edilir

sorun basit bir işlevi işaretçisi varsa dladdr + (örneğin o & fonksiyonu geçirilerek) cüce fonksiyonları yardımcı olabilir. İşaretçinin backtrace (3) tarafından döndürüldüğünden farklı olduğu anlaşılıyor (3) (backtrace, bu fonksiyon göstergelerini doğrudan yığından alıyor).

Sorum şu, bu adları da çözmek için bazı yöntemlerin var mı? Ayrıca, iki işaretçi arasındaki farkın tam olarak ne olduğunu bilmek isterim.

Teşekkürler!

GÜNCELLEME: işaretçiler arasındaki

fark oldukça önemli:
Ben backtrace ile elde biridir: 0x8048ca4
doğrudan işaretçi sürümü: 0x3ba838

ikinci bir ihtiyacı Bana göre bir ofset.

+0

İşaretçiler * çok * farklı mı, yoksa biraz mı kapalı? – bstpierre

+0

@bstpierre: Soru güncellendi. – terminus

+1

Yığın üzerinde bulunan işaretçiler genellikle geçerli işleve yapılan çağrıdan hemen sonra komutun adresidir. Bunlar genellikle herhangi bir işlevin girişine işaretçilerle aynı değildir. – RBerteig

cevap

0

addr2line (1) sadece aradığınız şey olabilir.

+0

Çok hoş ama bu sadece zaten sahip olduğum işaretçiyi (backtrace tarafından verilen) çözebiliyor. Ayrıca, bu bir komut satırı işlevi ve 'programlı' bir çözüm arıyorum. – terminus

1

Belirtilen tipik adreslerdeki önemli farklılıklardan bir tahminde bulunmak, biri gerçek bir paylaşılan kitaplıktan, diğeri ise ana yürütülebilirliğinizden. man page for dladdr(3) arasındaki satırların okunması, sembolün dlopen(3) tarafından yüklenen bir modülde bulunmaması durumunda eşleşen dosya ve sembol adlarını yeniden yapılamayabilir.

Burada önemsediğiniz herhangi bir modülün sembollerini çıkarmamış olduğunuzu veya tüm bahislerin kapalı olduğunu varsayıyorum. Yürütülebilir semboller varsa, herhangi bir isimlendirilebilir işlevin adresi için tam olarak eşleşecek bir dosyaya bakmak mümkün olmalıdır. Bir işlevin bir göstergesi, her şeyden önce.

+0

Örnekteki her iki işaretçi de aynı işlevi temsil eder. – terminus

+0

Oh. Hmm. Bu farklı bir yüze koyar .... Dinamik bağlama aslında nasıl * nix * uygulandığını bilmiyorum, ancak yüklenen kitaplık için taslaklar varsa o zaman her şeyi açıklayabilir. İşlev göstergesi, belki de kitaplıktaki gerçek işleve atlayan bir saplama işaret ediyordur. – RBerteig

İlgili konular