2009-02-05 18 views
5

मान लें कि मेरी कक्षा में एक निजी पूर्णांक चर है जिसे गिनती कहा जाता है।जब कोई निजी सदस्य परिवर्तनीय मूल्य बदलता है तो मैं विजुअल स्टूडियो डीबगर में निष्पादन को कैसे रोक सकता हूं?

मैंने पहले से ही अपने कोड में ब्रेकपॉइंट मारा है। अब जारी रखने से पहले, मैं इसे बनाना चाहता हूं ताकि डीबगर किसी भी समय गिनती को बंद कर दिया जाए।

फ़ील्ड की गिनती को बढ़ावा देने और क्षेत्र की सेट विधि पर ब्रेकपॉइंट सेट करने के अलावा, क्या ऐसा करने का कोई और तरीका है?

+0

क्या भाषा? यदि आप अप्रबंधित सी ++ का उपयोग कर रहे हैं तो आप कर सकते हैं। – ChrisW

+0

मेरे मामले में मैं सी # का उपयोग करता हूं। –

उत्तर

3

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

यह एक छोटा संस्करण क्यों लागू नहीं किया गया है यह है कि यह प्रबंधित कोड में बहुत कठिन है। मूल कोड अच्छा और अनुमानित है। आप स्मृति बनाते हैं और जब तक आप कोई नई ऑब्जेक्ट नहीं बनाते (या स्पष्ट रूप से स्मृति की प्रतिलिपि बनाते हैं) तब तक यह स्थानांतरित नहीं होता है।

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

यह प्रबंधित ब्रेक पॉइंट्स को लागू करने वाले मुद्दों में से एक है।

+0

माइक्रोसॉफ्ट की टिप्पणी: http://connect.microsoft.com/VisualStudio/feedback/details/333647/data-breakpoints-in-managed-code –

0

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

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

0

एकमात्र तरीका मैं सोच सकता हूं कि ऐसा करने के लिए, चर पर राइट क्लिक करना है, और "सभी संदर्भ खोजें" का चयन करें। एक बार यह सभी संदर्भों को पाता है, तो आप उस कोड में प्रत्येक बिंदु पर एक नया ब्रेकपॉइंट बना सकते हैं जहां चर को मान दिया जाता है। यह संभवतः बहुत अच्छा काम करेगा, जब तक आप किसी अन्य फ़ंक्शन के संदर्भ में चर को पार नहीं कर रहे थे और वहां मान बदल रहे थे। उस स्थिति में, आपको यह बदलने के लिए स्मृति में एक विशिष्ट बिंदु देखने का कुछ तरीका चाहिए कि यह कब बदला जाए। मुझे यकीन नहीं है कि वीएस में ऐसा उपकरण मौजूद है या नहीं।

0

क्रिसडब्ल्यू की तरह टिप्पणी की। आप 'डेटा ब्रेकपॉइंट' सेट कर सकते हैं लेकिन केवल देशी (गैर-प्रबंधित) कोड के लिए। कचरा कलेक्टर कचरा कलेक्टर चलाता है जब आवंटित स्मृति ब्लॉक चारों ओर आवंटित करेगा। इस प्रकार, प्रबंधित कोड के लिए डेटा ब्रेकपॉइंट्स संभव नहीं हैं।

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

0

फ़ील्ड की गिनती को बढ़ावा देने और क्षेत्र की सेट विधि पर ब्रेकपॉइंट सेट करने के अलावा, क्या ऐसा करने का कोई और तरीका है?

इसे एक अलग वर्ग की संपत्ति बनाएं, कक्षा का एक उदाहरण बनाएं, और संपत्ति पर ब्रेकपॉइंट सेट करें।

बजाय

...

test() 
{ 
    int i = 3; 
    ...etc... 
    i = 4; 
} 

... है ...

class Int 
{ 
    int m; 
    internal Int(int i) { m = i; } 
    internal val { set { m = value; } get { return m; } } 
} 

test() 
{ 
    Int i = new Int(3); 
    ...etc... 
    i.val = 4; 
} 

बात है कि, सी # का उपयोग कर, सब कुछ की वास्तविक स्मृति स्थान लगातार जाया जा रहा है: और इसलिए डीबगर आसानी से सीपीयू के 'मेमोरी एक्सेस पर ब्रेक' डीबगिंग रजिस्टर का उपयोग नहीं कर सकता है, और डीबगर के लिए कोड कोड स्थान ब्रेकपॉइंट लागू करना आसान है।

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