2010-05-26 11 views
5

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

+0

डीबगर एक विकल्प क्यों नहीं है? यह वही है जो इसके लिए है। –

+0

@ 0xA3 क्योंकि मुझे अपने आवेदन के भीतर से रनटाइम पर उन मानों तक पहुंचने की आवश्यकता है, केवल तभी जब वे बदल जाएंगे। – luvieere

+0

वैरिएबल के परिवर्तन मानों को एक साधारण लॉग फ़ाइल में लिखने के बारे में कैसे। – Shivam

उत्तर

3

आप इस धारणा से काम कर रहे हैं कि डीबगर परिवर्तनीय परिवर्तनों को ट्रैक कर सकता है। यह नहीं कर सकता

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

प्रबंधित डीबगर ब्रेकपॉइंट पर "जब हिट" स्थिति का समर्थन करता है, जिससे आप आउटपुट विंडो में जानकारी डंप कर सकते हैं। हालांकि इसे ब्रेकपॉइंट की आवश्यकता है, इसे वैरिएबल वैल्यू में बदलाव से ट्रिगर नहीं किया जा सकता है। यह भी वास्तव में कोड निष्पादन धीमा कर देता है क्योंकि डीबगर वास्तव में स्थिति को निष्पादित करने से पहले एक ब्रेक स्थिति में प्रवेश करता है।

इस तरह के ब्रेकपॉइंट को रखने के लिए स्पष्ट स्थान एक संपत्ति सेटटर में है। इस सुविधा को कोड में लागू करने के लिए आपको क्या करना होगा। उदाहरण के लिए ट्रेस क्लास का उपयोग करके आप उस सेटटर में जो कुछ भी चाहते हैं, कर सकते हैं।

+0

⁺¹, हालांकि, मैं एक साधारण सशर्त ब्रेकपॉइंट के धीमे धीमे होने के बिंदु से थोड़ा असहमत हूं। चूंकि सी # को बाइटकोड में परिवर्तित किया जा रहा है, इसलिए डीबगर के लिए सबसे उपयुक्त तरीका सिर्फ एक बाइटकोड बनाना और डालना है जो मान के स्थान पर एक मान मुद्रित करता है। मुझे कोई कारण नहीं दिख रहा है कि ऐसा क्यों किया जा सकता है - और इसलिए एक डीबगर ब्रेकपॉइंट का एक और कार्यान्वयन मैं एक प्रदर्शन बग कहूंगा। –

+2

नहीं, सी # मशीन कोड में परिवर्तित किया गया है, आईएल सिर्फ एक मध्यस्थ कदम है। इसे देखने के लिए डीबग> विंडोज> Disassembly का उपयोग करें। फ़ीचर, एक बग नहीं। –

0

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

private int myValue; 
public int MyValue { 
    get {return myValue;} 
    set { 
     SomeTraceMethod(myValue, value, ...); 
     myValue = value; 
    } 
} 

जाहिर है, इसका उपयोग मनमाना फ़ील्ड/चर के लिए नहीं किया जा सकता है।

+0

डीबगर इसे मनमानी चर के लिए कैसे करता है? क्या कोई डिबगिंग लाइब्रेरी नहीं है जो मुझे ट्रैक के समान स्तर को प्राप्त करने में मदद कर सकती है? – luvieere

3

मार्क ने जो कहा, उसे जोड़ने के लिए, यदि आप इसे बहुत सारी संपत्तियों और विधियों के लिए करना चाहते हैं तो आप पहलू उन्मुख प्रोग्रामिंग तकनीकों और पोस्टशर्प जैसे पुस्तकालयों को देखना चाहेंगे।

http://www.sharpcrafters.com/postsharp

0

दूसरों के लिए एक तंत्र उल्लेख किया है कि केवल समझ में आता है जैसे जब गुणों का उपयोग करके। .NET में आप INotifyPropertyChanged इंटरफ़ेस का उपयोग कर सकते हैं।

किसी नमूने के लिए कैसे लागू करने के लिए यह स्पष्ट रूप से Windows Forms के बारे में

How to: Implement the INotifyPropertyChanged Interface

संदर्भित लेख वार्ता देखते हैं, लेकिन आप (इंटरफ़ेस वास्तव में में घोषित किया जाता है कि करने के लिए बाध्य नहीं कर रहे हैं System.dll में System.ComponentModel नेमस्पेस)। वास्तव में, इस इंटरफ़ेस का व्यापक रूप से डेटा बाइंडिंग परिदृश्यों के लिए उपयोग किया जाता है, उदा। डब्ल्यूपीएफ में

+0

मैंने इस सवाल में उल्लेख किया है कि मुझे मनमाना चर में रुचि है, गुण नहीं। मुझे INotifyPropertyChanged के बारे में पता है, जो मुझे नहीं पता है कि डिबगर की तरह मनमाने ढंग से चर का पता लगाने के लिए कैसे किया जाता है। उत्तर के लिए – luvieere

1

प्रबंधित डीबगर ICorDebug COM API का उपयोग बहुत अधिक सब कुछ के लिए करता है। जिस हिस्से में आप रुचि रखते हैं वह ICorDebugValue और इसके वंशज हैं। ध्यान दें कि विभिन्न निरीक्षणों के लिए डीबगिंग एपीआई की एक बहुत सी आवश्यकता है कि प्रक्रिया नहीं चल रही है (यानी, ब्रेकपॉइंट का सामना करना पड़ा है)।ICorDebug का एक उच्च स्तरीय अवलोकन here है। इस पर प्रलेखन थोड़े विचित्र है, लेकिन कुछ गूगलिंग मदद कर सकता है। सौभाग्य।

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