2013-05-27 5 views
23

एक .NET अनुप्रयोग में मेरे पास कुछ बिंदु हैं जहां मुझे वर्तमान थ्रेड स्थिति के बारे में कुछ डीबग जानकारी एकत्र करने की आवश्यकता है। मैं कुछ जानकारी new StackTrace() कन्स्ट्रक्टर प्राप्त कर सकता हूं। विशेष रूप से, मैं वर्तमान स्टैक फ्रेम की सूची प्राप्त कर सकता हूं, जिसमें संबंधित MethodInfo ऑब्जेक्ट्स शामिल हैं, जो मुझे आईएल कोड, स्थानीय चर और पैरामीटर और पैरामीटर नामों की संख्या प्रदान कर सकते हैं।मैं स्टैक पर स्थानीय लोगों और पैरामीटर के वर्तमान मूल्य कैसे प्राप्त कर सकता हूं?

मैं कैसे मूल्यों इन स्थानीय लोगों और मापदंडों के (आदिम प्रकार के कम से कम) वर्तमान मिल सकता है?

मैं एप्लिकेशन में किसी भी डिबगर्स मैन्युअल रूप से संलग्न करने में सक्षम नहीं हूं, लेकिन यदि आवश्यक हो तो एप्लिकेशन नई प्रक्रियाओं को जन्म दे सकता है।

+1

http: // stackoverflow पर एक नज़र डालें।com/प्रश्न/75076/प्राप्त पैरामीटर-मान-से-stackframe में शुद्ध? RQ = 1। –

+6

यह संभव नहीं है, स्थानीय चर और विधि तर्कों को जिटर द्वारा अत्यधिक अनुकूलित किया जाता है। प्रतिबिंब से पहुंच से बाहर। केवल एक डीबगर के पास उनके मूल्यों का निरीक्षण करने पर एक शॉट होता है, यह जानता है कि उन्हें कहां पढ़ना है। आमतौर पर, यह अभी भी रिलीज बिल्ड के लिए काम नहीं करता है। –

+0

@ एक्स.सी. आप उन्हें एक रन डेटा क्लास में सहेज सकते हैं, और उसे फ़ाइल में प्रिंट कर सकते हैं ... –

उत्तर

0

क्या आप कंसोल में या एक लॉग फ़ाइल में अपने चर के मान लिखने में सक्षम हैं?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable); 
Console.WriteLine("Value of my variable: "+myvariable); 
0

आप पद्धति पर इस का उपयोग करने के लिए होता है कि इस तरह के इनलाइनिंग क्या आप देखना चाहते हैं देखने से नहीं रोकता शामिल किया गया।

MethodImplOptions.NoInlining

आमतौर पर, अन्य स्थानीय जानकारी के लिए, आप एक लकड़हारा एक डाटाबेस या फ्लैट फ़ाइल या कि प्रकृति के कुछ करने के लिए इस्तेमाल करते हैं।

2

प्रतिबिंब, क्या आप MethodInfo और अन्य विवरण प्राप्त करने के लिए प्रयोग कर रहे हैं, संकलन समय पर बनाया मेटाडाटा का उपयोग करता है - जो है, डेटा आप तक पहुँच रहे हैं रन से कोई संबंध नहीं समय डेटा, जो आप चाहते हैं।

आपने उल्लेख किया है कि आप डीबगर का उपयोग नहीं कर सकते हैं, और आप सही हैं, क्योंकि उत्पादन कोड में आमतौर पर आपके असेंबली में कोई डीबग प्रतीक लोड नहीं होता है; एक डीबगर का कोई उपयोग नहीं किया जाएगा।

यहां एक महत्वपूर्ण बात यह है कि प्रति एनईटी आर्किटेक्चर, एक बार जब आप एक असेंबली चलाते हैं, तो "जिटर" चलता है और आपके आईएल कोड को देशी कोड में बदल देता है; नतीजा यह है कि स्मृति में लोड किया गया शुद्ध मशीन कोड है जिसे आप मान प्राप्त करने के लिए बहुत आसानी से हैक नहीं कर सकते हैं (हालांकि सैद्धांतिक रूप से संभव)। उल्लिखित एक और बिंदु ऑप्टिमाइज़ेशन हैं - जब तक वे चालू होते हैं, तो आप विधियों को गायब होने की उम्मीद कर सकते हैं ( को रेखांकित किया गया है), निष्पादन आदेश बदला जा सकता है और अक्षर को अक्षर द्वारा प्रतिस्थापित किया जा सकता है। आपके कोड को तेज़ी से चलाने के लिए कंपाइलर बहुत सारी चीज़ें करता है।


हालांकि मैं स्थानीय लोगों को प्राप्त करने के लिए एक अच्छा समाधान नहीं देख सकते हैं 'रन-टाइम में मूल्यों, मुझे लगता है कि मानकों को प्राप्त करने के लिए तरीके हैं' अवरोधन तकनीक का उपयोग मूल्य। PostSharp आपके लिए क्या कर सकता है पर एक नज़र डालें।

0

पोस्टशर्प का उपयोग करने के लिए एक उत्कृष्ट विकल्प है। यह पहलू ओरिएंटेड प्रोग्रामिंग और कोड इंजेक्शन पर आधारित है। यह आपको विधि में पैरामीटर मानों को लेने के लिए प्रेरित करता है।

शायद आपकी आवश्यकताओं का हिस्सा हल कर सकते हैं।

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