2008-08-26 13 views
18

सालों से मैं कंसोल पर संदेश लिखने के लिए VB.NET में DEBUG कंपाइलर निरंतर उपयोग कर रहा हूं। मैं भी इसी तरह से System.Diagnostics.Debug.Write का उपयोग कर रहा हूँ। यह हमेशा मेरी समझ थी कि जब रिलीज का उपयोग बिल्ड विकल्प के रूप में किया जाता था, तो इन सभी बयानों को कंपाइलर द्वारा छोड़ा गया था, जो आपके उत्पादन कोड को डीबग स्टेटमेंट के ओवरहेड से मुक्त कर रहा था। हाल ही में सिल्वरलाइट 2 बीटा 2 के साथ काम करते समय, मैंने देखा कि विजुअल स्टूडियो वास्तव में एक रिलीज से जुड़ा हुआ है कि मैं एक सार्वजनिक वेबसाइट से बाहर निकल रहा था और डीबीयूजीजी स्टेटमेंट्स प्रदर्शित करता था जो मैंने माना था कि संकलित भी नहीं किया गया था! अब, मेरा पहला झुकाव यह मानना ​​है कि मेरे पर्यावरण में कुछ गड़बड़ है, लेकिन मैं सिस्टम पर गहरी जानकारी के साथ किसी से भी पूछना चाहता हूं। डायग्नोस्टिक्स। डेबग और डीबीयूजी बिल्ड विकल्प सामान्य रूप से जो मैं यहां गलतफहमी कर सकता हूं।.NET कंपाइलर - DEBUG बनाम रिलीज

उत्तर

21

पसंदीदा तरीका वास्तव में करने के लिए है अपने डीबग कॉल को लपेटने के लिए सशर्त विशेषता का उपयोग करें, कंपाइलर निर्देशों का उपयोग न करें। #ifs मुश्किल हो सकता है और अजीब निर्माण समस्याओं का कारण बन सकता है।

एक सशर्त विशेषता का उपयोग का एक उदाहरण इस प्रकार है (सी # में है, लेकिन VB.NET में भी काम करता है):

[ Conditional("Debug") ] 
private void WriteDebug(string debugString) 
{ 
    // do stuff 
} 

जब आप डीबग ध्वज सेट के बिना संकलन, WriteDebug के लिए किसी भी कॉल को हटा दिया जाएगा जैसा कि माना जाता था डीबग। राइट() के साथ हो रहा था।

+0

बहुत बढ़िया ... नई छोटी सी चाल सीखना प्यार !! – BigBlondeViking

+1

मुझे लगता है कि 'सशर्त एट्रिब्यूट' का उपयोग करना मतलब है कि विधि अभी भी वास्तविक रिलीज असेंबली का हिस्सा है, यह अभी लोड नहीं हुआ है। तो मुझे लगता है कि डीबग कोड को हटाने का एकमात्र * सही * तरीका संकलक निर्देशों का उपयोग करना है? – James

-6

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

रिलीज का उपयोग निश्चित रूप से सिस्टम को हटा नहीं देगा। डायग्नोस्टिक्स.डिबग। राइट स्टेटमेंट्स।

+0

वे एक ही नहीं कर रहे हैं; और डिफ़ॉल्ट रूप से रिलीज मोड वास्तव में विधि पर लागू ConditionalAttribute की वजह से Debug.Write को कॉल को हटा देता है। –

1

मैं क्या मेरी अपनी कक्षा में डीबग करने के लिए कॉल को संपुटित और एक precompiler निर्देश

public void Debug(string s) 
{ 
#if DEBUG 
    System.Diagnostics.Debug(...); 
#endif 
} 
1

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

मुझे विश्वास है कि System.Diagnostics.Debug.Write हमेशा एक डिबगर को आउटपुट करेगा, भले ही आपने रिलीज़ मोड में बनाया हो। MSDN article प्रति:

श्रोताओं संग्रह में ट्रेस श्रोताओं को डीबग के बारे में जानकारी लिखता है।

आप नहीं करना चाहते हैं किसी भी उत्पादन, आप जुआन की तरह डीबग निरंतर साथ Debug.Write करने के लिए अपने कॉल रैप करने के लिए की आवश्यकता होगी ने कहा:

#if DEBUG 
    System.Diagnostics.Debug.Write(...); 
#endif 
1

मैंने लेख भी पढ़ा, और इससे मुझे विश्वास हुआ कि जब DEBUG को परिभाषित नहीं किया गया था, तो सिस्टम पर घोषित सशर्त एट्रिब्यूट। डिबग फ़ंक्शंस संकलक को इस कोड को पूरी तरह से छोड़ने का कारण बनता है। मैं ट्रेस के लिए एक ही बात सच मानता हूं। यही है, System.Diagnostics.Debug फ़ंक्शंस में DEBUG और TRACE के लिए सशर्त एट्रिब्यूट होना चाहिए। मैं उस धारणा में गलत था। अलग ट्रेस क्लास में एक ही कार्य होता है, और ये TRACE निरंतर पर निर्भर सशर्त एट्रिब्यूट परिभाषित करता है।

System.Diagnostics.Debug से

: _ लोक साझा उप लिखें (_ संदेश स्ट्रिंग के रूप में _ )

System.Diagnostics से।ट्रेस: ​​ _ लोक साझा उप WriteLine (_ संदेश स्ट्रिंग के रूप में _ )

यह तो लगता है कि अपने मूल धारणा सही था, कि System.Diagnostics.Debug (या system.Diagnostics.Trace) बयान वास्तव में नहीं कर रहे हैं संकलन में शामिल है जैसे कि उन्हें #IF DEBUG (या #IF TRACE) क्षेत्रों में शामिल किया गया था।

लेकिन मैंने यहां से लोगों से भी सीखा है, और सत्यापित किया है कि रिलीज बिल्ड स्वयं ही इसका ख्याल नहीं रखता है। कम से कम सिल्वरलाइट परियोजनाओं के साथ, जो अभी भी थोड़ी चंचल हैं, आपको "उन्नत संकलन विकल्प" में प्रवेश करने की आवश्यकता है और सुनिश्चित करें कि DEBUG परिभाषित नहीं है।

हम .NET 1.1/VS2003 से .NET 3.5/VS2008 तक कूद गए, इसलिए मुझे लगता है कि इनमें से कुछ अलग-अलग काम करते थे, लेकिन शायद यह 2.0/VS2005 में बदल गया था।

5

Debug.Write विधि की जांच करें। यह

[Conditional("DEBUG")] 

विशेषता के साथ चिह्नित है।

ConditionalAttribute राज्यों के लिए MSDN मदद:

compilers कि एक विधि कॉल या विशेषता अनदेखा किया जाना चाहिए जब तक कि एक निर्दिष्ट सशर्त संकलन प्रतीक परिभाषित किया गया है करने के लिए इंगित करता है।

चाहे बिल्ड कॉन्फ़िगरेशन में रिलीज या डीबग का कोई लेबल है, इससे कोई फर्क नहीं पड़ता कि क्या डीबीयूजी प्रतीक इसमें परिभाषित किया गया है या नहीं।

1

कि क्या आप डिबग जानकारी संकलित की या हटाया जा करना चाहते हैं का चयन करने के

परियोजना के गुण विंडो में "बिल्ड" टैब में।

सही विन्यास (सक्रिय/रिलीज/डीबग/सभी) चुनें और सुनिश्चित करें कि आप "डीबग लगातार" जाँच अगर आप की जानकारी, चाहते हैं या इसे अचयनित तुम नहीं करता है, तो कर सकते हैं।

परिवर्तन लागू करें और पुनर्निर्माण

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