2011-11-14 17 views
17

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

void testAddZeros() 
{ 
    Number a(0); 
    Number b(0); 
    Number result = a.add(b); 
    assert((a + b) == Number(0)) 
} 
void testAddOnes() 
{ 
    Number a(1); 
    Number b(1); 
    Number result = a.add(b); 
    assert((a + b) == Number(2)); 
} 
void testAddNegativeNumber() 
{ 
    Number a(1); 
    Number b(-1) 
    Number result = a.add(b); 
    assert((a + b) == Number(0)); 
} 

अगर testAddZeros() और testAddOnes() रन ठीक है, लेकिन testAddNegativeNumber() कल्पना कीजिए। इस मामले में Number result = a.add(b); पर ब्रेकपॉइंट सेट करना डीबगिंग शुरू करने के लिए एक प्राकृतिक जगह होगी। अब कल्पना करें कि त्रुटि Number::add के अंदर कहीं गहरी स्थित है, इसलिए हम Numbers::add में शुरू होने वाली सामग्री में वास्तव में हस्तक्षेप नहीं कर रहे हैं। मैं क्या करना चाहता हूं Numbers::add के अंदर कहीं ब्रेकपॉइंट सेट करना है जो केवल testAddNegativeNumber() -test के अंदर है तो ट्रिगर करता है।

क्या ब्रेकपॉइंट ब्रेकपॉइंट B स्वचालित रूप से सक्षम करने का कोई तरीका है?

+1

क्या आपने सशर्त ब्रेकपॉइंट्स की जांच की है? शायद आप उस स्थिति का उपयोग कर सकते हैं जिस पर 'सशर्त' ब्रेकपॉइंट बी को सक्षम करने के लिए ब्रेकपॉइंट ए मारा जाता है। (उस स्थिति में आपको मैबी को ब्रेकपॉइंट ए की आवश्यकता नहीं है) – ChristiaanV

+0

@ क्रिस्टियानवी: हाँ, लेकिन मुझे डर है कि सशर्त ब्रेकपॉइंट्स नहीं होंगे इस मामले में पर्याप्त - कम से कम सामान्य रूप से नहीं। – larsmoa

+0

क्या आप एक कोड नमूना दिखा सकते हैं, जहां आप इसका उपयोग करना चाहते हैं? – ChristiaanV

उत्तर

19

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

मुझे मिले सबसे सुलभ स्टोरेज में से एक ऐप डोमेन कस्टम गुण है। उन्हें System.AppDomain.CurrentDomain.GetData और SetData विधियों द्वारा एक्सेस किया जा सकता है। {(, "तोड़" सच) System.AppDomain.CurrentDomain.SetData}

breakpoint condition

:

तो पहला ब्रेकप्वाइंट पर आप एक "जब हिट" के साथ की स्थापना को परिभाषित

निर्भर ब्रेकपॉइंट पर, हिट हालत सेट करें:

System.AppDomain.Current डोमेन। गेटडाटा ("ब्रेक")! = शून्य

+0

मुझे आश्चर्य होगा कि इस तरह की चीज ट्रेसपॉइंट्स के साथ काम करेगी ... अब मुझे पता है। Upvoted! – codekaizen

2

यह सबसे अच्छा मुझे लगता है कि तुम कर सकते हो के बारे में है, लेकिन यह एक हैक भी प्रयास करने के लिए की बहुत बड़ी लगती है, क्योंकि यह एक चर जोड़ दिया जाता है ...

string breakpointToStopOn = string.Empty; 
Console.WriteLine("HERE"); // You can set breakpoint A here, 
          // with a condition (right click on the breakpoint, then selectCondition), 
          // that sets breakpointToStopOn = "A" 
Console.WriteLine("B"); // and you can set your breakpoint here with this condition 
         // (breakpointToStopOn == "A"); 

आप वास्तव में सक्षम नहीं होगा Console.WriteLine ("यहां") लाइन पर रुकने के लिए, लेकिन आप ब्रेकपॉइंट को सक्षम या अक्षम कर सकते हैं, जो प्रभावी रूप से अन्य ब्रेकपॉइंट को सक्षम करेगा।

हालांकि सावधान रहें, सशर्त ब्रेकपॉइंट स्टेटमेंट डीबगिंग के दौरान आपके ऐप के प्रदर्शन को गंभीरता से खराब कर देगा।

+0

हालांकि यह वही नहीं है जो मैं ढूंढ रहा था, मुझे लगता है कि यह सबसे अच्छा (अच्छा, केवल) सुझाव है। – larsmoa