Bir Delphi programından veya derleyici tarafından oluşturulan hata ayıklama bilgisinden yerel değişken bilgilerini (adres ve tür) nasıl çıkarırsınız?


105

Amacım:

  • Yığını yürümek için Delphi tarafından derlenmiş 32 veya 64 bit Windows programında askıya alınmış bir iş parçacığı verildiğinde (yapılabilir)
  • Her yöntemdeki yerel değişkenleri ve değerlerini numaralandırmak için verilen yığın girişleri. Yani, en azından, adreslerini ve türlerini (tamsayı32 / 64 / işaretli / işaretsiz, dize, kayan nokta, kayıt, sınıf ...) bulun ve bunların kombinasyonu değerlerini bulmak için kullanılabilir.

Birincisi iyi ve bu soru ile ilgili olan ikinci soru. Yüksek düzeyde, Delphi'de bir yığın girişi verildiğinde yerel değişkenleri nasıl numaralandırırsınız?


Düşük düzeyde, araştırdığım şey bu:

RTTI: yöntemler hakkında bu tür bilgileri listelemez. Bu aslında gerçekçi bir seçenek olduğunu düşündüğüm bir şey değildi, ama yine de burada listelemek.

Hata ayıklama bilgileri: Bir hata ayıklama derlemesi için üretilen hata ayıklama bilgilerini yükleme.

  • Harita dosyaları: ayrıntılı bir harita dosyası bile (bir metin biçimli dosya! Birini açın ve bir bakın) yerel değişken bilgisi içermez. Temelde adreslerin ve kaynak dosya satır numaralarının bir listesi. Adrese dosyalama ve çizgi korelasyonu için harika, örneğin oluktaki mavi noktalar; daha ayrıntılı bilgi için harika değil
  • Uzaktan hata ayıklama bilgileri (RSM dosyası) - içeriği veya biçimi hakkında bilinen bilgi yok .
  • TD32 / TDS dosyaları: şu anki araştırma alanım. Diğer birçok bilginin yanında küresel ve yerel semboller içerirler.

Burada karşılaştığım sorunlar:

  • TD32 dosya biçimiyle ilgili bir belge yok (bulabildiğim.)
  • Onlar hakkındaki bilgilerimin çoğu onları kullanan Jedi JCL kodundan (JclTD32.pas) geliyor ve bu kodu nasıl kullanacağımdan veya oradaki yapıların yerel değişkenleri gösterecek kadar kapsamlı olup olmadığından emin değilim. Küresel sembolleri ele alacağından oldukça eminim, ancak yerelden çok emin değilim. Biçim için tanımlanmış ve dokümantasyonsuz çok çeşitli sabitler vardır, ne anlama geldiklerini okumak için, tahminim kalmadı. Ancak bu sabitler ve isimleri bir yerden gelmelidir.
  • TDS bilgisini kullanarak bulabildiğim kaynak yerel sembolleri yüklemiyor veya işlemiyor.

Doğru yaklaşım buysa, bu soru 'TDS / TD32 dosya formatı için dokümantasyon var mı ve yerel değişkenleri yükleyen herhangi bir kod örneği var mı?'

Bir kod örneği gerekli değildir, ancak çok az olsa bile çok yararlı olabilir.


2
TD32 bilgilerine erişmek için aslında Jedi JCL birimlerini kullanmadım - bunun için kendi özel kütüphanem var, ancak ihtiyacınız olan tüm temel tesisat JclTD32.pas içinde var gibi görünüyor. Değişken bilgilerine erişmek için bulabileceğim bir demo kodu yok, ancak oradaki örnek (.. \ jcl \ samples \ windows \ debug \ sourceloc) TD32 verilerinden satır numarası bilgilerinin nasıl alınacağını gösteriyor, bu yüzden ihtiyacınız olanı elde etmek için bunun üzerine inşa edebilmelisiniz. Lütfen bulduklarınızı buraya tekrar
500 - Dahili Sunucu Hatası

2
@ 500-InternalServerError Teşekkürler. Satır numarası bilgisi kolaydır (harita dosyalarında bile bulunur) - ancak JCL kodunda gördükleriniz hakkında özellikle yerel sembollerle ilgili herhangi bir bilgi verebilir misiniz? Ayrıca meraktan dolayı, TD32'ye ait özel kitaplığınız nedir ve yayınlanır / kamuya açık olarak kullanılabilir mi yoksa yalnızca şirket içinde mi?
David

3
Altındaki her prosedür / işlev / yöntem sembolü, kendine özgü olan sembollerin bir listesini içerir. Tanımların çoğu Jedi biriminde varmış gibi görünüyor, ancak bazıları yorum yapıyor. Benim önerim, küçük test uygulamaları oluşturmak ve bir semboller listesinin ne döndürdüğüne bakmak olacaktır. Sahip olduğum kod tescillidir ve benim yayınlamam için değildir. Yine de yerel değişkenler konusunu kapsamıyor. Ancak temel aldığı bilgiler yarı halka açık olduğundan, belirli duvarlarla karşılaşırsanız size yardımcı olabilirim.
500 - Dahili Sunucu Hatası

4
tds2pdb ( code.google.com/p/map2dbg ) tds dosyaları için bir ayrıştırıcıya sahip görünüyor. Yine de C # kodu.
Graymatter

4
Evet, gayri resmi bir belge vardı, ama sonra Borland (o sırada) hata ayıklama bilgilerine erişmek yerine dahili biçimi değiştirebilmeleri ve belgeleri güncellemeleri gerekmemesi için bir dll yayınlamaya karar verdi. Maalesef şu anda ne orijinal belgeyi ne de dll'yi bulamıyorum. Embarcadero teknik desteğe başvurmanızı ve bunu sormanızı öneririm.
500 - Dahili Sunucu Hatası

Yanıtlar:


2

Herhangi bir hata ayıklama sembolünün ikili olarak olup olmadığını kontrol edin. Ayrıca GDB kullanmak da mümkündür (Windows'ta bir bağlantı noktası). Bir .dbg veya .dSYM dosyası bulursanız harika olur. Örneğin, kaynak kodu içerirler.

gdb> list foo
56 void foo()
57 {
58  bar();
59  sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60  raise(SIGHUP);
61  signal(SIGHUP, fnc);
62  baz(fnc);
63 }

Herhangi bir hata ayıklama dosyanız yoksa, MinGW veya Cygwin'i deneyebilir ve nm (1) ( man sayfası ) kullanabilirsiniz. İkiliden sembol isimlerini okuyacaktır. C ++ olanlar gibi bazı türleri içerebilirler:

int abc::def::Ghi::jkl(const std::string, int, const void*)

--demangleO zaman seçenek eklemeyi unutmayın, yoksa şöyle bir şey alırsınız:

__ZN11MRasterFont21getRasterForCharacterEh

onun yerine:

MRasterFont::getRasterForCharacter(unsigned char)

2
Jakub, cevap için teşekkürler. Maalesef muhtemelen belirli bir hata ayıklama biçimini okumam gerekiyor - TDS. Delphi uygulamaları, Windows'ta GDB uyumlu hata ayıklama bilgileriyle derlenmez. Nm'nin de nasıl yardımcı olacağından emin değilim, çünkü muhtemelen Delphi'nin oluşturmadığı belirli bir hata ayıklama dosyası biçimine dayanacaktır. Yoksa cevabınızı yanlış mı anladım - örneğin GDB Delphi'nin sembollerini okuyabilir mi?
David

@DavidM, yorumunuz çok önemli. Windows'ta GNU Binutils veya GNU Debugger bağlantı noktasını bulmaya çalışın (Yalnızca Binutils bağlantı noktasını biliyorum). GDB için bir BFD kütüphanesi var. Binutils'te de kullanılır. Birden fazla dosya biçimini okumaya ve bunları sihirli numaralarıyla tanımaya izin verir. Her şey başarısız olursa, adlı aracı kullanın strings. Herhangi bir ikili dosyadan dizeleri çıkaracaktır. Man sayfasına bakın . Bu, yardımcı olabilecek ancak gerekmeyen dizeleri yazdıracak
Top Sekret

0

Http://download.xskernel.org/docs/file%20formats/omf/borland.txt Açık Mimari El Kitabına bir göz atın . Eski, ancak dosya biçimiyle ilgili bazı bilgiler bulabilirsin.


Lütfen biraz içerik ekler misiniz, bağlantı gelecekte bozulabilir.
Hintham

Bağlantı, Borland derleyicisi tarafından kullanılan OMF dosya biçimi ve Borland tarafından kullanılan diğer ikili dosya biçimleri hakkında Borland'dan alınan resmi belgeyi içerir. Birkaç yıl önce TDS dosya formatına bir göz attım ve bazı kısımların belgelenen dosya formatlarıyla uyumlu olduğunu gördüm. TDS dosyasından yerel değişkenler hakkında herhangi bir bilgi toplamaya çalışırken, bağlantılı belgeler kullanılmalı veya referans gösterilmelidir. Bağlantı koparsa cevabım işe yaramaz ve gerekli bilgiler kaybolur. Bağlantılı "Açık Mimari El Kitabı" eski Turbo Pascal ve C sürümlerinin bir parçasıydı.
Muetze 1
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.