सालों से मैं कंसोल पर संदेश लिखने के लिए VB.NET में DEBUG कंपाइलर निरंतर उपयोग कर रहा हूं। मैं भी इसी तरह से System.Diagnostics.Debug.Write का उपयोग कर रहा हूँ। यह हमेशा मेरी समझ थी कि जब रिलीज का उपयोग बिल्ड विकल्प के रूप में किया जाता था, तो इन सभी बयानों को कंपाइलर द्वारा छोड़ा गया था, जो आपके उत्पादन कोड को डीबग स्टेटमेंट के ओवरहेड से मुक्त कर रहा था। हाल ही में सिल्वरलाइट 2 बीटा 2 के साथ काम करते समय, मैंने देखा कि विजुअल स्टूडियो वास्तव में एक रिलीज से जुड़ा हुआ है कि मैं एक सार्वजनिक वेबसाइट से बाहर निकल रहा था और डीबीयूजीजी स्टेटमेंट्स प्रदर्शित करता था जो मैंने माना था कि संकलित भी नहीं किया गया था! अब, मेरा पहला झुकाव यह मानना है कि मेरे पर्यावरण में कुछ गड़बड़ है, लेकिन मैं सिस्टम पर गहरी जानकारी के साथ किसी से भी पूछना चाहता हूं। डायग्नोस्टिक्स। डेबग और डीबीयूजी बिल्ड विकल्प सामान्य रूप से जो मैं यहां गलतफहमी कर सकता हूं।.NET कंपाइलर - DEBUG बनाम रिलीज
उत्तर
पसंदीदा तरीका वास्तव में करने के लिए है अपने डीबग कॉल को लपेटने के लिए सशर्त विशेषता का उपयोग करें, कंपाइलर निर्देशों का उपयोग न करें। #ifs मुश्किल हो सकता है और अजीब निर्माण समस्याओं का कारण बन सकता है।
एक सशर्त विशेषता का उपयोग का एक उदाहरण इस प्रकार है (सी # में है, लेकिन VB.NET में भी काम करता है):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
जब आप डीबग ध्वज सेट के बिना संकलन, WriteDebug के लिए किसी भी कॉल को हटा दिया जाएगा जैसा कि माना जाता था डीबग। राइट() के साथ हो रहा था।
वीबी.नेट में डीबग और रिलीज के बीच चयन करने में मेरे अनुभव में कोई फर्क नहीं पड़ता। आप दोनों कॉन्फ़िगरेशन में कस्टम क्रियाएं जोड़ सकते हैं, लेकिन डिफ़ॉल्ट रूप से मुझे लगता है कि वे वही हैं।
रिलीज का उपयोग निश्चित रूप से सिस्टम को हटा नहीं देगा। डायग्नोस्टिक्स.डिबग। राइट स्टेटमेंट्स।
वे एक ही नहीं कर रहे हैं; और डिफ़ॉल्ट रूप से रिलीज मोड वास्तव में विधि पर लागू ConditionalAttribute की वजह से Debug.Write को कॉल को हटा देता है। –
मैं क्या मेरी अपनी कक्षा में डीबग करने के लिए कॉल को संपुटित और एक precompiler निर्देश
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
जोड़ने जैसे आपने कहा, वास्तव में विधानसभा से कोड को छोड़ देते हैं जाएगा डीबग संकलक प्रतीक का उपयोग करना है।
मुझे विश्वास है कि System.Diagnostics.Debug.Write हमेशा एक डिबगर को आउटपुट करेगा, भले ही आपने रिलीज़ मोड में बनाया हो। MSDN article प्रति:
श्रोताओं संग्रह में ट्रेस श्रोताओं को डीबग के बारे में जानकारी लिखता है।
आप नहीं करना चाहते हैं किसी भी उत्पादन, आप जुआन की तरह डीबग निरंतर साथ Debug.Write करने के लिए अपने कॉल रैप करने के लिए की आवश्यकता होगी ने कहा:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
मैंने लेख भी पढ़ा, और इससे मुझे विश्वास हुआ कि जब 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 में बदल गया था।
Debug.Write विधि की जांच करें। यह
[Conditional("DEBUG")]
विशेषता के साथ चिह्नित है।
ConditionalAttribute राज्यों के लिए MSDN मदद:
compilers कि एक विधि कॉल या विशेषता अनदेखा किया जाना चाहिए जब तक कि एक निर्दिष्ट सशर्त संकलन प्रतीक परिभाषित किया गया है करने के लिए इंगित करता है।
चाहे बिल्ड कॉन्फ़िगरेशन में रिलीज या डीबग का कोई लेबल है, इससे कोई फर्क नहीं पड़ता कि क्या डीबीयूजी प्रतीक इसमें परिभाषित किया गया है या नहीं।
कि क्या आप डिबग जानकारी संकलित की या हटाया जा करना चाहते हैं का चयन करने के
परियोजना के गुण विंडो में "बिल्ड" टैब में।
सही विन्यास (सक्रिय/रिलीज/डीबग/सभी) चुनें और सुनिश्चित करें कि आप "डीबग लगातार" जाँच अगर आप की जानकारी, चाहते हैं या इसे अचयनित तुम नहीं करता है, तो कर सकते हैं।
परिवर्तन लागू करें और पुनर्निर्माण
- 1. DEBUG बनाम _DEBUG
- 2. .NET यूनिट परीक्षण - रिलीज कोड
- 3. रिलीज मोड बनाम डीबग = "झूठा"
- 4. प्रकाशित डीएलएल में डीबग/रिलीज मोड का निर्धारण करें? #DEBUG
- 5. .NET डीबग/रिलीज
- 6. .Net रिलीज डीबग
- 7. सामान्य रिलीज बनाम रखरखाव रिलीज पर नीति?
- 8. कोड रिलीज बनाम डीबग मोड
- 9. रिलीज बनाम स्नैपशॉट्स
- 10. Autorelease बनाम रिलीज
- 11. सी # डीबग बनाम रिलीज
- 12. मेवेन रिलीज प्लगइन: जावा कंपाइलर संस्करण
- 13. विजुअल स्टूडियो - डीबग बनाम रिलीज
- 14. .NET, Java जावास्क्रिप्ट कंपाइलर
- 15. डीबग बनाम .NET के अनुकूलन में रिलीज (उपयोगकर्ताओं को वितरित करते समय चिंताओं)
- 16. रिलीज बनाम डीबग बिल्ड टाइम्स
- 17. आईफोन एसडीके: Dealloc बनाम रिलीज?
- 18. डीबग बनाम रिलीज एंड्रॉइड एनडीके
- 19. क्या एमएसबिल्ड DEBUG के अलावा किसी भी बिल्ड कॉन्फ़िगरेशन को पहचानता है। रिलीज
- 20. प्रोग्राम का पता लगाने के रिलीज/डीबग मोड (.NET)
- 21. क्या रूबी .NET कंपाइलर है?
- 22. .NET के लिए आईएल कंपाइलर?
- 23. DEBUG = False
- 24. DEBUG मोड
- 25. कैसे बताएं कि एक .NET अनुप्रयोग DEBUG या रिलीज मोड में संकलित किया गया था या नहीं?
- 26. रिलीज मोड
- 27. जेएस/सीएसएस में सेक्शन प्रतिस्थापन, डीबग बनाम रिलीज
- 28. जावा बनाम .NET
- 29. सेमफोर। वैटोन/रिलीज बनाम मॉनिटर। पल्स/रुको
- 30. मेवेन स्नैपशॉट रिपोजिटरी बनाम रिलीज रिपोजिटरी
बहुत बढ़िया ... नई छोटी सी चाल सीखना प्यार !! – BigBlondeViking
मुझे लगता है कि 'सशर्त एट्रिब्यूट' का उपयोग करना मतलब है कि विधि अभी भी वास्तविक रिलीज असेंबली का हिस्सा है, यह अभी लोड नहीं हुआ है। तो मुझे लगता है कि डीबग कोड को हटाने का एकमात्र * सही * तरीका संकलक निर्देशों का उपयोग करना है? – James