visual studio जब दृश्य स्टूडियो डीबगर का उपयोग कर कोई मान बदलता है तो तोड़ें




visual-studio debugging (9)

वास्तव में पुरानी पोस्ट लेकिन अगर कोई अनजान है ...

विजुअल स्टूडियो 2015 में , आप एक ऑटो-कार्यान्वित संपत्ति के set एक्सेसर पर ब्रेकपॉइंट डाल सकते हैं और जब संपत्ति अपडेट हो जाती है तो डीबगर टूट जाएगा

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

अद्यतन करें

वैकल्पिक रूप से, @AbdulRaufMujahid ने टिप्पणियों में बताया है कि यदि ऑटो लागू संपत्ति एक ही पंक्ति पर है, तो आप अपने कर्सर को get; कर सकते get; या set; और F9 मारा और एक ब्रेकपॉइंट तदनुसार रखा जाएगा। अच्छा!

public bool IsUpdated { get; set; }

क्या वैरिएबल पर घड़ी रखने का कोई तरीका है और जब उस मान में परिवर्तन होता है तो केवल विजुअल स्टूडियो ब्रेक होता है?

यह मुश्किल राज्य के मुद्दों को ढूंढना इतना आसान बना देगा।

क्या यह किया जा सकता है?

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


आप शायद DebugBreak() फ़ंक्शन का चालाक उपयोग कर सकते हैं।


मुझे Visual Basic 6.0 का उपयोग करके वर्णित तरीके से याद है। विजुअल स्टूडियो में, मुझे अभी तक एकमात्र रास्ता मिला है जो ब्रेकपॉइंट की स्थिति निर्दिष्ट कर रहा है।


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

लेकिन दुख की बात है कि मुझे कोई ऐसा टूल नहीं मिला जो आपको किसी भी संपत्ति या चर के साथ ऐसा करने की अनुमति देगा।


आप चर के लिए वैकल्पिक रूप से = ऑपरेटर को अधिभारित कर सकते हैं और विशिष्ट स्थिति पर अधिभारित फ़ंक्शन के अंदर ब्रेकपॉइंट डाल सकते हैं।


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


आप कोड में स्पष्ट रूप से तोड़ने का भी चयन कर सकते हैं:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

एमएसडीएन से:

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

हालांकि, यह केवल एक फॉलबैक है। जैसा कि अन्य टिप्पणियों में वर्णित है, विजुअल स्टूडियो में एक सशर्त ब्रेकपॉइंट सेट करना बेहतर विकल्प है।


कल्पना करें कि आपके पास निम्न घोषणा के साथ ए नामक एक वर्ग है।

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

जब आप "m_value" के मान को संशोधित करते हैं तो आप प्रोग्राम को रोकना चाहते हैं।

कक्षा परिभाषा पर जाएं और ए के निर्माता में ब्रेकपॉइंट डालें।

A::A()
{
    ... // set breakpoint here
}

एक बार जब हमने कार्यक्रम बंद कर दिया:

डीबग -> नया ब्रेकपॉइंट -> नया डेटा ब्रेकपॉइंट ...

पता: और (यह-> m_value)
बाइट गणना: 4 (क्योंकि int में 4 बाइट हैं)

अब, हम कार्यक्रम फिर से शुरू कर सकते हैं। जब मान बदल जाता है तो डीबगर बंद हो जाएगा।

आप विरासत कक्षाओं या यौगिक कक्षाओं के साथ भी ऐसा ही कर सकते हैं।

class B
{
   private:
       A m_a;
};

पता: और (यह-> m_a.m_value)

यदि आप वेरिएबल के बाइट्स की संख्या नहीं जानते हैं जिन्हें आप निरीक्षण करना चाहते हैं, तो आप आकार के ऑपरेटर का उपयोग कर सकते हैं।

उदाहरण के लिए:

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

यदि आप "कॉल स्टैक" देखते हैं तो आप उस फ़ंक्शन को देख सकते हैं जिसने चर के मान को बदल दिया है।


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







debugging