जब Visual Studio डीबगर का उपयोग कर कोई मान बदलता है तो विराम लें


198

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

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

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

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


लेकिन जब तक स्थिति पकड़ में नहीं आती, तब तक ब्रेकपॉइंट कुछ भी प्रभावित नहीं करता है, इसलिए आप अपने ब्रेकपॉइंट को कहीं भी (सेटर की तरह) रख सकते हैं और इसे वहां से ले जा सकते हैं। या क्या मैं कुछ न कुछ भूल रहा हूं?
Oskar

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

क्षमा करें, कभी कोई रास्ता नहीं देखा, जहाँ तक मुझे पता है कि सेटर जाने का रास्ता है
Oskar

1
मुझे बेहतर समाचार मिलने की उम्मीद थी; vs2010 इंगित करता है कि कोई बदलाव नहीं msdn.microsoft.com/en-us/library/350dyxd0.aspx केवल देशी c ++ में यह @Scottgu है जो आप बेहतर कर सकते हैं!
gerryLowry

जवाबों:


134

Visual Studio 2005 मेनू में:

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

दर्ज:

&myVariable

38
क्या यह प्रबंधित कोड के लिए उपलब्ध है? मुझे यह विकल्प C # प्रोजेक्ट के लिए अक्षम दिखाई देता है। याद रखें कहीं न कहीं यह डिबगिंग प्रबंधित एप्स को लागू करने के लिए एक कठिन सुविधा है जिसमें विशेष रूप से कचरा संग्रहकर्ता शामिल हैं।
गुलज़ार नाजिम

27
यह केवल अप्रबंधित कोड के लिए उपलब्ध है, दुर्भाग्य से: msdn.microsoft.com/en-us/library/350dyxd0.aspx
जोश कोडरॉफ़

17
आप किसी क्षेत्र को अस्थायी रूप से एक संपत्ति में परिवर्तित कर सकते हैं और गेट्टर या सेटर पर एक ब्रेकपॉइंट लगा सकते हैं।
जॉन डेविस

12
"डीबग -> न्यू ब्रेकपॉइंट" के तहत "डेटा ब्रेकप्वाइंट" विकल्प अक्षम है .. किसी भी विचार क्यों? यह अक्षम विकराल रहता है या नहीं, मैं वास्तव में डिबगिंग कर रहा हूं या नहीं। मैं विज़ुअल स्टूडियो 2015 का उपयोग कर रहा हूं
jbb

2
मेरे लिए थोड़ी देर लेकिन @jbb यह केवल तभी सक्षम है जब मैं डीबगिंग के दौरान एक विराम बिंदु पर रोक दिया जाता हूं।
Allball103

27

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

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

MSDN से:

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

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


2
FWIW, संपादित करें और जारी रखें मैं इसे इस तरह से करना पसंद करता हूं: IME, सशर्त ब्रेकप्वाइंट का नारा दिया जाता है
मार्क सोउल

यह काम करता है - लेकिन यह बहुत दर्दनाक है - मैंने कुछ इसी तरह का काम किया - मैंने इसे उस हर विधि के शीर्ष पर रखा जिस पर मुझे संदेह था - और फिर सबसे नीचे (अंत में एक खंड में) - इस तरह से मैं वास्तव में जानता था विधि समस्या पैदा कर रही थी - (अर्थात मुझे पता था कि विधि में प्रवेश करने से पहले डेटा अच्छा था, और फिर इसे बाहर निकलने से पहले खराब था)।
ब्रेनस्ल्गस83

26

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

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

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

अपडेट करें

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

public bool IsUpdated { get; set; }

5
भले ही ऑटो कार्यान्वित संपत्ति एक पंक्ति में है जैसे सार्वजनिक स्ट्रिंग उपयोगकर्ता नाम {सेट; प्राप्त; }। उपयोगकर्ता गेट्टर या सेटर को उजागर कर सकता है और ब्रेकपॉइंट को जोड़ने के लिए F9 दबा सकता है
अब्दुल रऊफ

@AbdulRaufMujahid बहुत बढ़िया!
क्रेग

13

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

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)

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

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

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

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


1
इसलिए, यदि आप जिस चीज की तलाश कर रहे हैं वह वास्तव में मेरी अपनी कक्षाओं में नहीं है तो आप क्या करेंगे? जैसे, उदाहरण के लिए, मैं यह पता लगाने की कोशिश कर रहा हूं कि कोई नियंत्रण सक्षम या अक्षम कहां है? मैं डिबगिंग के दौरान नियंत्रण के सक्षम मूल्य पर एक घड़ी जोड़ सकता हूं, निश्चित रूप से, लेकिन इसे बदलने पर ब्रेक लगाने का कोई तरीका नहीं है और फिर देखो कि यह कहां रुका है।
Nyerguds

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

9

चर को एक संपत्ति में बदलें और सेट विधि में एक ब्रेकप्वाइंट जोड़ें। उदाहरण:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}

3

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

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


3

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


2

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


2

जैसा कि पीटर मोर्टेंसन ने लिखा है:

Visual Studio 2005 मेनू में:

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

दर्ज करें: और myVariable

अतिरिक्त जानकारी:

जाहिर है, सिस्टम को पता होना चाहिए कि मेमोरी में कौन सा पता देखना है। तो - myVariable(या myClass.m_Variable) के आरंभीकरण के लिए एक सामान्य ब्रेकपॉइंट सेट करें - सिस्टम को चलाएं और उस ब्रेकपॉइंट पर रुकने तक प्रतीक्षा करें। - अब मेनू प्रविष्टि सक्षम है, और आप चर दर्ज करके &myVariableया उदाहरण दर्ज करके देख सकते हैं &myClass.m_Variable। अब पते अच्छी तरह से परिभाषित हैं।

क्षमा करें, जब मैंने पहले से दिए गए समाधान के बारे में समझाकर गलत किया। लेकिन मैं एक टिप्पणी नहीं जोड़ सका, और इस बारे में कुछ टिप्पणियां हुई हैं।


1

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


1

आप शायद डिबगब्रेक () फ़ंक्शन का एक चतुर उपयोग कर सकते हैं ।


बिल्कुल कैसे? एक तंग लूप में एक अलग धागा चलाकर और डिबगब्रेक को लागू करने से () जब भी कोई बदलाव हुआ है?
13

@nalpy आप उदाहरण के लिए उन स्थानों का पता लगा सकते हैं जहां myVariableउपयोग किया जाता है और एक सहायक previousValueचर में उपयोग करने के बाद अपने मूल्यों को संग्रहीत करते हैं , फिर जब डिबगब्रेक () कहते हैं myVariable!=previousValue; तब आपको पता चल जाएगा कि किन कोड ब्लॉक myVariableमें बदलाव हुआ है। लेकिन मैं सहमत हूं कि एशेल्ली का समाधान सबसे अच्छा है।
1:22

1

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


1

2019 में अपडेट:

यह अब आधिकारिक तौर पर .Net Core 3.0 या उच्चतर के लिए Visual Studio 2019 पूर्वावलोकन 2 में समर्थित है। बेशक, आपको आईडीई के पूर्वावलोकन संस्करण का उपयोग करने के संभावित जोखिमों में कुछ विचार रखने पड़ सकते हैं। मैं कल्पना करता हूं कि निकट भविष्य में इसे आधिकारिक विजुअल स्टूडियो में शामिल किया जाएगा।

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

सौभाग्य से, डेटा ब्रेकप्वाइंट्स अब C ++ अनन्य नहीं हैं क्योंकि वे अब Visual Studio 2018 पूर्वावलोकन 2 में .NET कोर (3.0 या उच्चतर) के लिए उपलब्ध हैं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.