2008-11-26 14 views
9

मैं प्रतिबिंब में डायनेमिक मोड क्लास का उपयोग करके रनटाइम पर कुछ कोड जेनरेट करने का प्रयास कर रहा हूं। नेमस्पेस दर्ज करें लेकिन किसी कारण से इसे "सत्यापन अपवाद" फेंकना है। यहां आईएल कोड है जिसका उपयोग मैं करने की कोशिश कर रहा हूं ...मैं प्रतिबिंब का उपयोग कर रनटाइम पर जेनरेट किए गए आईएल कोड को कैसे डिबग करूं।

ldarg.1 
ldarg.0 
ldfld, System.String FirstName 
callvirt, Void Write(System.String) 
ldarg.1 
ldarg.0 
ldfld, System.String LastName 
callvirt, Void Write(System.String) 
ldarg.1 
ldarg.0 
ldfld, Int32 Age 
callvirt, Void Write(Int32) 
ret 

मुझे जेनरेट किए गए आईएल कोड को डीबग करने का एक तरीका चाहिए। आपके पास कौन से विकल्प हैं? मैं वीएस -2008 पेशेवर का उपयोग कर रहा हूँ।

उत्तर

9

मैं कुछ और अधिक मदद यहाँ पाया है ...

DebuggerVisualizer for DynamicMethod (Show me the IL) यह जिसका उपयोग करके आप क्रम में उत्पन्न आईएल को देखने के लिए सक्षम हो जाएगा एक डिबगर विजुआलाइज़र है!

और इससे भी बेहतर Debugging LCG है जो आपको विंडबग का उपयोग कर रनटाइम पर जेनरेट कोड को डीबग करने की अनुमति देता है!

2

आईएल की जांच के लिए peverify उपकरण का उपयोग करने का प्रयास करें। MSDN से:

peverify.exe व्यापक MSIL सत्यापन dataflow विश्लेषण के साथ साथ वैध मेटाडाटा पर कई सौ नियमों की एक सूची के आधार पर चेक के प्रदर्शन करती है। चेकों Peverify.exe करता है के बारे में विस्तृत जानकारी के लिए, "मेटाडाटा मान्यता विशिष्टता" और "MSIL इंस्ट्रक्शन सेट विशिष्टता" .नेट फ्रेमवर्क एसडीके में उपकरण डेवलपर मार्गदर्शिका फ़ोल्डर में देखते हैं।

यद्यपि उत्पन्न होने के लिए आपको जेनरेट कोड को असेंबली के रूप में सहेजने की आवश्यकता होगी।

0

डीबग (कम से कम निर्मित नहीं) का उपयोग करने के अर्थ में सीधे आईएल डीबग करने का कोई तरीका नहीं है। आपके पास वास्तव में केवल दो विकल्प हैं

  1. रॉब से पूछें। एक डीएलएल/EXE में मैन्युअल रूप से आईएल और ilasm टाइप करें। फिर अपनी त्रुटि देखने के लिए परिणामी डीएलएल पर peverify चलाएं।
  2. यदि आप वास्तव में आईएल डीबग करना चाहते हैं तो आप शायद इसे कच्चे असेंबली के साथ फंस गए हैं।
0

आपको आईएल डीबग करने में सक्षम होने के लिए प्रतीकात्मक जानकारी उत्सर्जित करने की आवश्यकता है।

Emitting Symbolic Information with Reflection Emit

और आपकी फ़ाइल में coresponding स्थान है कि यह उत्सर्जन करता है के साथ उत्सर्जित opcodes मेल खाते हैं। (कहाँ ILGenerator.Emit() कॉल है)।

लेकिन यह निश्चित रूप से एक छोटा काम नहीं है।

संपादित करें:

आप नहीं डिबग कोड है कि निरीक्षण नहीं है, यह जीत एड बिल्कुल नहीं मिलता है सकते हैं। आपको आईएल ऑप्स के सही उपयोग की जांच करनी होगी। क्या हर किसी के पास उस आवश्यक प्रकार के उचित संचालन हैं जो इसकी अपेक्षा करता है?

संपादित करें 2:

और यह करने के लिए आसान तरीका सी # का उपयोग कर तो Reflector का उपयोग या किसी अन्य आईएल disassembler भी देखना आईएल और तुम्हारा की तुलना कोड बनाने के लिए है।

संपादित करें 3: दुर्भाग्यवश डीबग जानकारी को डायनामिक मोड का उपयोग करके उत्सर्जित नहीं किया जा सकता है, लेकिन आईएल को डंप करने के लिए विनडबीजी का उपयोग किया जा सकता है, जोस फको बॉनिन ने इसे अपने ब्लॉग में समझाया।Executing dynamic IL with DynamicMethod:

मुख्य समस्या यह है कि हम DynamicMethod साथ अनुभव है कि हम , LCG के लिए जानकारी डिबगिंग उत्पन्न करने की क्षमता नहीं है के बाद से डिबगिंग एपीआई मेटाडाटा LCG नहीं है के आधार पर है। किसी भी मामले में, सभी खो गए हैं क्योंकि हम WinDBG के साथ डिबगिंग जारी रख सकते हैं। ...

इस प्रक्रिया में आगे की व्याख्या की गई है।

+0

क्या मैं गतिशील विधियों (एलसीजी) के साथ प्रतीकात्मक जानकारी का उपयोग कर सकता हूं? मैंने परावर्तक के खिलाफ अपने आईएल की जांच की है और वे समान हैं। लेकिन मुझे यकीन नहीं है कि जेनरेटेड आईएल ** वास्तव में ** इंडेंटिकल है या नहीं। –

+0

मैंने आपके प्रश्न का उत्तर देने के लिए एक संपादन किया है, उम्मीद है कि यह मदद करता है। –

0

यह डिबगिंग अंत में आपकी मदद नहीं कर सकता है, लेकिन RunSharp आईएल उत्पन्न करने के लिए एक अच्छा टूल है जो आपको सामान्य नुकसान से बचने में मदद करता है। यह लेखन आईएल को सी # लिखने की तरह बहुत अधिक महसूस करता है। http://www.codeproject.com/KB/dotnet/runsharp.aspx

+0

मैंने रनशर्प की कोशिश की है और मुझे कहना होगा कि मैं प्रभावित हुआ था लेकिन अंततः मैं इसे कठिन तरीके से करने के लिए बस गया क्योंकि ऐसा लगता है कि इसे छोड़ दिया गया है। उदाहरण के लिए आप एक विधि कॉल के वापसी मूल्य की जांच नहीं कर सकते (Invoke में वापसी मूल्य वापस करने के लिए कोई तंत्र नहीं है)! –

0
ldarg.1 
ldarg.0 
ldfld, System.String FirstName 
callvirt, Void Write(System.String) 

इस स्तर आप अभी भी ढेर पर ARG1 है पर:

यहाँ उदाहरण के साथ एक सिंहावलोकन है।

+1

हां, जिसे बाइनरीवाइटर :: कॉल को कॉल करने के लिए तर्क के रूप में प्रयोग किया जाता है। यह एक बाइनरीवाइटर ऑब्जेक्ट का संदर्भ है और इसे "इस सूचक" के रूप में पास किया गया है। –

+0

दाएं :) याद आ गया! – leppie

संबंधित मुद्दे