2009-08-25 15 views
13

के तहत चलते समय प्रोग्राम प्रवाह बदलना क्या यह पता लगाने का कोई तरीका है कि स्मृति में डीबगर चल रहा है?डीबगर

और यहां फॉर्म लोड छद्म कोड पर आता है।

if debugger.IsRunning then 
Application.exit 
end if 

संपादित करें: मूल शीर्षक था

+1

अधिकांश डिबगर कार्यावधि में एक प्रक्रिया के साथ संलग्न किया जा सकता है:

private object _calculatedProperty; public object SomeCalculatedProperty { get { if (_calculatedProperty == null) { object property = /*calculate property*/; if (System.Diagnostics.Debugger.IsAttached) return property; _calculatedProperty = property; } return _calculatedProperty; } } 

मैं अपने डिबगर कदम दर के माध्यम से सुनिश्चित करने के लिए मूल्यांकन छोड़ नहीं करता है समय पर इस प्रकार का उपयोग किया है। उस स्थिति में statrup पर डीबगर की जांच बहुत मदद नहीं करेगा। –

उत्तर

29

"स्मृति डीबगर में एक का पता लगा रहा" निम्नलिखित

if (System.Diagnostics.Debugger.IsAttached) { 
    ... 
} 
5

दो बातें ध्यान में रखने के इस उपयोग करने से पहले एक आवेदन चल रहा है बंद करने के लिए प्रयास करें डीबगर में:

  1. मैंने एसी खींचने के लिए एक डीबगर का उपयोग किया है एक वाणिज्यिक .NET एप्लिकेशन से फट ट्रेस करें और इसे उस कंपनी को भेजें जहां इसे बाद में इसे आसान बनाने के लिए धन्यवाद दिया गया था और
  2. यह चेक trivially पराजित हो सकता है।

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

private object _calculatedProperty; 

public object SomeCalculatedProperty 
{ 
    get 
    { 
     bool debuggerAttached = System.Diagnostics.Debugger.IsAttached; 

     if (_calculatedProperty == null || debuggerAttached) 
     { 
      object property = /*calculate property*/; 
      if (debuggerAttached) 
       return property; 

      _calculatedProperty = property; 
     } 

     return _calculatedProperty; 
    } 
} 
+0

यह एक अच्छा विचार है - लेकिन यह डीबगर के तहत चलते समय आपके प्रोग्राम के प्रवाह को बदलता है, इसलिए अब आप रिलीज में उपयोग किए जाने वाले कोड को डीबग नहीं कर रहे हैं। आईएमएचओ ज्यादातर मामलों में संपत्ति के गैर-कैश किए गए संस्करण को प्रदान करने के लिए बेहतर होगा (#if DEBUG के अंदर, इसलिए इसे रिलीज़ में नहीं बनाया गया है) कि आप मूल्य की जांच करने के लिए डीबगर में उपयोग कर सकते हैं, जिससे "असली" संपत्ति काम कर रही है डीबग और रिलीज बिल्ड दोनों में एक ही तरह से। –

+0

@ जेसन: हाँ और नहीं। इस मामले में, संपत्ति का मूल्यांकन करने के लिए बुलाए जाने वाले सभी तरीके शुद्ध हैं (जब भी बुलाए जाने पर ध्यान दिए बिना कोई दुष्प्रभाव नहीं), इसलिए मैं वास्तव में यह सुनिश्चित कर रहा था कि यह गुणों के साथ-साथ एप्लिकेशन के परिप्रेक्ष्य से भी हो। –