आप डेल्फी प्रोग्राम या कंपाइलर-जनरेट डीबग जानकारी से स्थानीय चर जानकारी (पता और प्रकार) कैसे निकालते हैं?


105

मेरा लक्ष्य है:

  • स्टैक (चलने योग्य) चलने के लिए डेल्फी-संकलित 32 या 64-बिट विंडोज प्रोग्राम में एक निलंबित धागे को देखते हुए।
  • स्टैक प्रविष्टियों को देखते हुए, प्रत्येक विधि और उनके मूल्यों में स्थानीय चरों की गणना करना। यही है, बहुत कम से कम, उनके पते और प्रकार (पूर्णांक 32/64 / हस्ताक्षरित / अहस्ताक्षरित, स्ट्रिंग, फ्लोट, रिकॉर्ड, वर्ग ...) का संयोजन खोजें, जिसका उपयोग उनके मूल्य को खोजने के लिए किया जा सकता है।

पहला ठीक है और यह दूसरा सवाल है। उच्च स्तर पर, आप डेल्फी में स्टैक एंट्री के लिए स्थानीय वेरिएबल्स की गणना कैसे करते हैं?


निम्न स्तर पर, यह वही है जिसकी मैं जाँच कर रहा हूँ:

RTTI: तरीकों के बारे में इस तरह की जानकारी को सूचीबद्ध नहीं करता है। यह ऐसा कुछ नहीं था जिसे मैंने कभी सोचा था कि यह एक यथार्थवादी विकल्प है, लेकिन वैसे भी यहां सूचीबद्ध करना।

डीबग जानकारी: डीबग बिल्ड के लिए उत्पादित डीबग जानकारी लोड हो रहा है।

  • मानचित्र फाइलें: यहां तक ​​कि एक विस्तृत मानचित्र फ़ाइल (एक पाठ-प्रारूप फ़ाइल! एक को खोलें और एक नज़र डालें) में स्थानीय चर जानकारी नहीं है। यह मूल रूप से पते और स्रोत फ़ाइल लाइन नंबरों की एक सूची है। फ़ाइल और लाइन सहसंबंध के पते के लिए महान, जैसे कि नाली में नीले डॉट्स; अधिक विस्तृत जानकारी के लिए महान नहीं
  • दूरस्थ डिबगिंग जानकारी (RSM फ़ाइल) - इसकी सामग्री या प्रारूप पर कोई ज्ञात जानकारी नहीं है
  • TD32 / TDS फाइलें: अनुसंधान की मेरी वर्तमान पंक्ति। उनमें बहुत सी अन्य जानकारियों के बीच वैश्विक और स्थानीय प्रतीक हैं।

मैं यहाँ जिन समस्याओं का सामना कर रहा हूँ वे हैं:

  • TD32 फ़ाइल प्रारूप का कोई दस्तावेज़ीकरण नहीं है (जो मुझे मिल सकता है।)
  • उनमें से मेरा अधिकांश ज्ञान जेडीसीएल जेसीएल कोड से आता है जो उनका उपयोग कर रहा है (JclTD32.pas) और मुझे यकीन नहीं है कि उस कोड का उपयोग कैसे किया जाए, या क्या वहां की संरचनाएं स्थानीय संस्करण दिखाने के लिए पर्याप्त व्यापक हैं। मुझे पूरा यकीन है कि यह वैश्विक प्रतीकों को संभाल लेगा, लेकिन मैं स्थानीय के बारे में बहुत अनिश्चित हूं। प्रारूप के लिए और दस्तावेजों के बिना परिभाषित विभिन्न प्रकार के स्थिरांक हैं, यह पढ़ने के लिए कि उनका क्या मतलब है, मुझे अनुमान लगाना छोड़ दिया गया है। हालांकि, उन स्थिरांक और उनके नाम कहीं से आने चाहिए।
  • स्रोत मैं टीडीएस जानकारी का उपयोग करके स्थानीय प्रतीकों को लोड या संभाल नहीं पाता है।

यदि यह सही दृष्टिकोण है, तो यह प्रश्न बन जाता है कि 'क्या TDS / TD32 फ़ाइल प्रारूप के लिए प्रलेखन है, और क्या कोई कोड नमूने हैं जो स्थानीय चर लोड करते हैं?'

एक कोड नमूना आवश्यक नहीं है, लेकिन बहुत उपयोगी हो सकता है, भले ही यह बहुत कम हो।


2
मैंने वास्तव में जेडीसीएल जेसीएल इकाइयों का उपयोग टीडी 32 सूचना तक पहुंचने के लिए नहीं किया है - मेरे पास इसके लिए अपना स्वयं का मालिकाना पुस्तकालय है, लेकिन यह सभी बुनियादी पाइपलाइन की तरह दिखता है जिसकी आपको आवश्यकता है JclTD32.pas में। कोई डेमो कोड नहीं है जो मैं चर जानकारी तक पहुंचने के लिए पा सकता हूं, हालांकि, लेकिन वहां जो नमूना है (.. \ jcl \ example \ windows \ debug \ sourceloc में) दिखाता है कि कैसे TD32 डेटा से लाइन नंबर की जानकारी प्राप्त की जाए, आपको उस पर निर्माण करने में सक्षम होना चाहिए जो आपको चाहिए। कृपया वापस यहां रिपोर्ट करें कि आपको क्या पता है :)
500 - आंतरिक सर्वर त्रुटि

2
@ 500-इंटरनलसेवरर्रर धन्यवाद। लाइन नंबर की जानकारी आसान है (यह मैप फ़ाइलों में भी है) - लेकिन क्या आप जेसीएल कोड में जो भी देखते हैं उस पर कोई जानकारी प्रदान कर सकते हैं जो विशेष रूप से स्थानीय प्रतीकों से संबंधित है? इसके अलावा, जिज्ञासा से बाहर, आपका TD32 मालिकाना पुस्तकालय क्या है, और क्या यह केवल सार्वजनिक रूप से उपयोग करने योग्य या घर में प्रकाशित / प्रकाशित किया जाता है?
डेविड

3
बदले में इसके तहत प्रत्येक प्रक्रिया / कार्य / विधि प्रतीक में उन प्रतीकों की एक सूची है जो इसके लिए स्थानीय हैं। जेडी इकाई में अधिकांश परिभाषाएँ दिखाई देती हैं, लेकिन कुछ टिप्पणी की जाती हैं। मेरा सुझाव होगा कि छोटे परीक्षण ऐप बनाएं और देखें कि प्रतीकों की गणना क्या है। मेरे पास कोड स्वामित्व है और मुझे प्रकाशित करने के लिए नहीं। यह वैसे भी स्थानीय चर के विषय को कवर नहीं करता है। लेकिन यह जिस जानकारी पर आधारित है, वह अर्ध-सार्वजनिक है, इसलिए यदि आप विशिष्ट दीवारों में भाग लेते हैं तो मैं इसमें मदद करने में सक्षम हो सकता हूं।
500 - आंतरिक सर्वर त्रुटि

4
tds2pdb ( code.google.com/p/map2dbg ) tds फ़ाइलों के लिए एक पार्सर लगता है। यह C # कोड है।
ग्रेमैटर

4
एक अनौपचारिक दस्तावेज़ हुआ करता था, हाँ, लेकिन तब बोरलैंड (उस समय) ने डिबग जानकारी तक पहुँचने के बजाय एक डीएल जारी करने का निर्णय लिया ताकि वे आंतरिक प्रारूप को बदल सकें और प्रलेखन को अद्यतन न करना पड़े। दुर्भाग्य से, मैं अभी न तो मूल दस्तावेज और न ही डीएल का पता लगा सकता हूं। मेरा सुझाव है कि आप Embarcadero तकनीकी सहायता से संपर्क करें और इसके बारे में पूछें।
500 - आंतरिक सर्वर त्रुटि

जवाबों:


2

जांचें कि क्या कोई डीबगिंग प्रतीक बाइनरी में नहीं थे। जीडीबी (विंडोज के एक पोर्ट पर) का उपयोग भी संभव है। यह बहुत अच्छा होगा अगर आपको एक .dbg या .dSYM फ़ाइल मिल जाए। वे स्रोत कोड होते हैं, उदाहरण के लिए।

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 }

यदि आपके पास कोई डीबगिंग फ़ाइल नहीं है, तो आप MinGW या Cygwin प्राप्त करने का प्रयास कर सकते हैं, और nm (1) ( मैन पेज ) का उपयोग कर सकते हैं। यह बाइनरी से प्रतीक नामों को पढ़ेगा। उनमें कुछ प्रकार शामिल हो सकते हैं, जैसे C ++ वाले:

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

--demangleविकल्प जोड़ना न भूलें या फिर आपको कुछ ऐसा मिलेगा:

__ZN11MRasterFont21getRasterForCharacterEh

के बजाय:

MRasterFont::getRasterForCharacter(unsigned char)

2
जैकब, उत्तर के लिए धन्यवाद। दुर्भाग्य से मुझे शायद एक विशिष्ट डिबग प्रारूप को पढ़ना होगा - टीडीएस। डेल्फी एप्लिकेशन को विंडोज पर जीडीबी-संगत डिबग जानकारी के साथ संकलित नहीं किया गया है। मुझे यकीन नहीं है कि एनएम या तो कैसे मदद करेगा, क्योंकि यह एक विशिष्ट डिबग फ़ाइल प्रारूप पर निर्भर करेगा जो शायद ऐसा नहीं है जो डेल्फी उत्पन्न करता है। या मैंने आपका जवाब गलत समझा है - क्या जीडीबी डेल्फी के प्रतीकों को पढ़ सकता है, उदाहरण के लिए?
डेविड

@ डेविड, आपकी टिप्पणी बहुत महत्वपूर्ण है। विंडोज पर GNU Binutils या GNU Debugger का पोर्ट खोजने की कोशिश करें (मुझे केवल Binutils पोर्ट ही पता है)। GDB के लिए एक BFD लाइब्रेरी है। इसका उपयोग बिनुटिल्स में भी किया जाता है। यह कई फ़ाइल स्वरूपों को पढ़ने और उन्हें उनके जादुई संख्या द्वारा पहचानने की अनुमति देता है। यदि सब कुछ विफल हो जाता है, तो टूल नामक टूल का उपयोग करें strings। यह किसी भी बाइनरी फ़ाइल से तार निकाल देगा। देखें आदमी पेज । यह तार जो प्रिंट होगा सकता है लेकिन उपयोगी हो की जरूरत नहीं है
शीर्ष Sekret

0

Http://download.xskernel.org/docs/file%20formats/omf/borland.txt ओपन आर्किटेक्चर हैंडबुक पर एक नज़र डालें । यह पुराना है, लेकिन हो सकता है कि आपको फ़ाइल प्रारूप के बारे में कुछ प्रासंगिक जानकारी मिल जाए।


क्या आप कुछ संदर्भ जोड़ सकते हैं, लिंक भविष्य में टूट सकता है।
हिंथम

लिंक में बोरलैंड कंपाइलर द्वारा उपयोग किए गए ओएमएफ फ़ाइल प्रारूप और बोरलैंड द्वारा उपयोग किए जाने वाले अन्य बाइनरी फ़ाइल स्वरूपों के बारे में बोरलैंड से आधिकारिक दस्तावेज है। कुछ साल पहले मैंने टीडीएस फ़ाइल फॉर्मेट पर एक नज़र डाली और ऐसा लगा कि कुछ हिस्से डॉक्यूमेंटेड फ़ाइल फॉर्मेट के साथ संगत हैं। टीडीएस फ़ाइल से स्थानीय चर के बारे में कोई भी जानकारी जुटाने की कोशिश करते समय, लिंक किए गए दस्तावेज़ का उपयोग किया जाना चाहिए या संदर्भित किया जाना चाहिए। यदि लिंक टूटा हुआ है, तो मेरा उत्तर बेकार हो जाएगा और आवश्यक जानकारी खो जाएगी। लिंक की गई "ओपन आर्किटेक्चर हैंडबुक" पुराने टर्बो पास्कल और सी रिलीज का हिस्सा थी।
मुअत्ज़े 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.