2012-05-26 12 views
13

में मापदंडों का मूल्य प्राप्त मैं कुछ इस तरह का उपयोग कर StackTrace द्वारा एक पैरामीटर के बारे में जानकारी प्राप्त कर सकते हैं:कैसे स्टैकट्रेस

catch (Exception ex) 
{ 
    var st = new StackTrace(ex); 

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); 
} 

मैं जानता हूँ कि मैं कैसे पैरामीटर का मान प्राप्त करना चाहते हैं। उदाहरण:

स्टैक ट्रेस में मेरी विधि की तरह था, तो:

void MyMethod(object value) 

और कॉल की तरह था:

MyMethod(10); 

मैं मूल्य से 10 मैं कैसे करते प्राप्त करना चाहते हैं?

+0

संभावित डुप्लिकेट [क्या .NET में कॉल स्टैक में प्रत्येक फ्रेम के लिए पैरामीटर मान प्राप्त करना संभव है] (http://stackoverflow.com/questions/819576/is-it-possible-to-get-parameters- मूल्य-के-प्रत्येक-फ्रेम-इन-कॉल-स्टैक-इन-नेट) – nawfal

उत्तर

9

दो तरीके हैं। .NET डीबगिंग के लिए COM API अधिक शक्तिशाली है। उदाहरण के लिए, कॉल स्टैक में फ़ंक्शन के तर्क और स्थानीय चर दोनों ICorDebugILFrame से पहुंच योग्य हैं। लेकिन यह एक अलग प्रक्रिया से चलाया जाना चाहिए जो आपकी प्रक्रिया से डीबगर के रूप में जुड़ा हुआ है।

अंतर्निहित आत्मनिरीक्षण के लिए, Profiler API, which also can find information about function arguments है। "छाया ढेर" के बारे में जानकारी देखें।

+0

fyi, आपका दूसरा लिंक मर चुका है – Fredou

+1

@Fredou: मुझे जानकारी देने के लिए धन्यवाद, मैंने जानकारी के नए पते के लिंक को अपडेट किया है। –

+0

उदाहरण कृपया! – Demodave

3

सी # के साथ नहीं, सिवाय इसके कि आप अत्यधिक सीएलआर (पैच) संस्करण निर्भर समाधान बना रहे हैं। लेकिन क्या काम करता है, अपने प्रक्रिया के लिए Windbg देते हैं अपने धागा करने के लिए sos.dll स्विच लोड और

!ClrStack -p 

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

अपने पहले प्रश्न का उत्तर देने के लिए। नहीं, जिस दृष्टिकोण से आप कोशिश कर रहे हैं उसके साथ यह संभव नहीं है। एक कामकाजी समाधान संभव होगा लेकिन सभी पोर्टेबल पर नहीं। एक प्रबंधित डीबगर आंशिक रूप से आपके तर्क पुनर्प्राप्त कर सकता है लेकिन कोई 100% कार्य समाधान नहीं है (यहां तक ​​कि डीबगर के तहत भी)।

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