2009-05-04 8 views
10

में कॉल स्टैक में प्रत्येक फ्रेम के लिए पैरामीटर के मान प्राप्त करना संभव है। मैं प्रबंधित .NET कोड के बारे में बात कर रहा हूं। यदि हम कोई प्रोग्राम चलाते हैं और वीएस संलग्न करते हैं तो हम कॉल स्टैक में प्रत्येक विधि के लिए पैरामीटर के मान देख सकते हैं। मैं एक लॉगिंग समाधान बनाना चाहता हूं जो कॉल स्टैक में प्रत्येक विधि के लिए सभी पैरामीटर के मान लॉग करेगा। वास्तव में मुझे अपवाद होने पर इस जानकारी की आवश्यकता होती है।क्या .NET

मुझे पता है कि प्रोफाइलिंग एपीआई के साथ यह संभव है। लेकिन मुझे आश्चर्य है कि यह केवल प्रबंधित कोड के साथ संभव है?

अद्यतन: ठीक है, शायद शुद्ध .NET के साथ यह असंभव है। फिर किसी प्रकार का अप्रबंधित कोड हो सकता है ... बिंदु यह है कि इसे एप्लिकेशन के भीतर से ही करना है। अपवाद के मामले में एक एप्लिकेशन कुछ लाइब्रेरी को कॉल कर सकता है (अप्रबंधित हो सकता है) जो कॉल स्टैक में विधियों के मानों के बारे में जानकारी देता है। बस विचार ...

+1

ध्यान दें कि विशेष रूप से "रिलीज" मोड, इनलाइनिंग आदि में ऑप्टिमाइज़ेशन, कॉल स्टैक में दिखाई देने वाली जानकारी नहीं बना सकता है। आपको इस तरह की जानकारी पर भरोसा नहीं करना चाहिए। – Lucero

+1

निश्चित रूप से, ऐप का तर्क ऐसी जानकारी पर भरोसा नहीं करना चाहिए। लेकिन मैं सिर्फ नैदानिक ​​उद्देश्य के लिए लॉगिंग के बारे में बात कर रहा हूं। – Shrike

+0

मुझे समझ में आया। फिर भी, अगर आपको लॉग निकालने और इसमें विश्वसनीय जानकारी नहीं है, तो इसकी उपयोगिता केवल सीमित है। – Lucero

उत्तर

8

पैरामीटर मान StackFrame उदाहरण में संग्रहीत नहीं हैं। वास्तव में, जब तक आप इसे स्पष्ट रूप से नहीं करना चुनते हैं, तब तक वे रिकॉर्ड/लॉग इन नहीं होते हैं।

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

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

2

आपका सर्वोत्तम विकल्प संभवतः प्रासंगिक विधियों में आवश्यक ट्रेस कोड डालने के लिए है। इस तरह आप आवश्यक होने पर ट्रेस श्रोताओं और डंप मान संलग्न कर सकते हैं।

मुझे पता है कि यह वह नहीं है जिसे आप पूछ रहे हैं, लेकिन यह डेटा प्राप्त करने का एक तरीका है।

वैकल्पिक रूप से, आप WinDbg का उपयोग कर एप्लिकेशन को डीबग कर सकते हैं। द क्लस्टैक /! डीएसओ कमांड आपको पैरामीटर का निरीक्षण करने और वस्तुओं को ढेर करने देगा।