2013-01-07 49 views
5

पिछले कुछ हफ्तों में, मैं the unmanaged .NET debugging API के साथ खेल रहा हूं।जेआईटीएड असेंबली डीबग करते समय उदाहरण फ़ील्ड पढ़ना

MSDN इंटरफेस ही है, दस्तावेजों पता लगाने के लिए वास्तव में किसी भी सार्थक तरीके से उन्हें इस्तेमाल करने करते हुए मैं the CLR Managed Debugger samples और ILSpy sources में विभिन्न ब्लॉगों (मुख्य रूप से Mike Stall's) और प्रबंधित रैपर का सहारा लिया। अंत में मैं अपने परीक्षण कार्यक्रम को चलने की प्रक्रिया में संलग्न करने, ब्रेकपॉइंट्स सेट करने और उन्हें हिट करने में सक्षम था।

मैं आगे क्या करना चाहता हूं, इस तरह के ब्रेकपॉइंट पर हमला करना है, प्रासंगिक ऑब्जेक्ट उदाहरण का एक क्षेत्र पढ़ें। यह ठीक काम करता है जब डीबग लक्ष्य विधि NGEN'ed या JIT'ed नहीं है, disabling loading NGEN'ed assemblies (पर्यावरण सेटिंग 'COMPLUS_ZAPDISABLE = 1') और disabling JIT optimizations (उर्फ '.ini फ़ाइल चाल')।

हालांकि, जब मैं अपने आदर्श लक्ष्य - खुदरा अनुकूलित (एनजीईएन/जेआईटी'एड) कोड के साथ ऐसा करने की कोशिश करता हूं - यह काम नहीं करता है। उदाहरण के लिए: मैं एंट्री ब्रेकपॉइंट को मारने पर अभी भी विधि तर्कों की संख्या पुनर्प्राप्त कर सकता हूं, लेकिन मुझे पहले तर्क नहीं मिल सकता है (डीबगिंग एपीआई अपवाद फेंकता है)।

अब, मुझे लगता है कि इसका कारण यह है क्योंकि डीबगिंग एपीआई प्लेटफार्म स्वतंत्र होने चाहिए, और इस मामले में असेंबली अब और नहीं हैं। लेकिन क्या होगा यदि मैं इंटेल को इस मंच निर्भरता को स्वीकार करता हूं: जहां तक ​​मुझे पता है कि सीएलआर fastcall calling convention का उपयोग करता है, जहां इस मामले में ईसीएक्स रजिस्टर में पहला विधि तर्क होता है (सदस्य कार्यों के लिए अंतर्निहित 'यह' संदर्भ)।

मैंने इसका परीक्षण किया, और वास्तव में ब्रेकपॉइंट पर हमला करने पर, ईसीएक्स में एनजीएनएड असेंबली में ऑब्जेक्ट्रेफ़ (ऑब्जेक्ट इंस्टेंस का पता) शामिल है।

अब उदाहरण फ़ील्ड पढ़ने में अंतिम चरण इस सूचक के सापेक्ष फ़ील्ड ऑफसेट को पुनर्प्राप्त करना है, और यह वह जगह है जहां मैं अटक गया हूं, क्योंकि मुझे यह पता लगाने में असमर्थ लगता है कि सीएलआर the packing of the instance fields during native code generation कैसे करता है।

मुझे एहसास है कि यह सीएलआर संस्करण/कार्यान्वयन निर्भर हो सकता है, लेकिन स्पष्ट रूप से ऐसे तरीके हैं, क्योंकि एसओएस एक्सटेंशन के साथ WinDbg इस लेआउट को खोजने में सक्षम है। यदि डीबगिंग एपीआई के माध्यम से नहीं, तो क्या मैं किसी भी तरह से SOS.dll का लाभ उठा सकता हूं?

उत्तर

0

आपके पहले प्रश्न के लिए, तर्क/स्थानीय नहीं ढूंढने का कारण यह है कि आप अनुकूलित कोड डिबग कर रहे हैं। अनुकूलित कोड तर्क/स्थानीय लोगों की ट्रैकिंग की अनुमति नहीं देता है।

आपके दूसरे प्रश्न के लिए, आपको ऑब्जेक्ट के फ़ील्ड को पढ़ने के लिए विजुअल स्टूडियो में WinDbg या SOS/PSSCOR में SOS.dll SOSEX.dll या PSSCOR2/4.dll का उपयोग करने की आवश्यकता है।

संपादित करें: अब मुझे लगता है कि आप इसे कोड से करना चाहते हैं। इसके लिए डेटा एक्सेस (डीएसी) एपीआई का उपयोग करने की आवश्यकता है, जो दुर्भाग्य से अनियंत्रित है।