2009-10-21 11 views
56

मुझे शायद यह पहले से ही पता होना चाहिए, लेकिन मुझे यकीन नहीं है और मुझे इसे दस्तावेज नहीं दिख रहा है।System.Diagnostics.Debug.WriteLine उत्पादन कोड

मैं सिस्टम.डिग्नोस्टिक्स.डिबग.राइटलाइन का उपयोग अक्सर विकास प्रक्रिया के दौरान चर या अपवादों में परिवर्तनों को ट्रैक करने में सक्षम होने के लिए करता हूं क्योंकि मैं कोड डीबग कर रहा हूं। यह विकास के दौरान केवल के विकास और समझ को आसान बनाने के लिए है। जब मैं उत्पादन में जाता हूं तो मैं आमतौर पर कोड को टिप्पणी करता हूं या इसे हटा देता हूं।

मुझे आश्चर्य है कि अगर मैं कोड को टिप्पणी करना भूल जाता हूं तो क्या होता है। उदाहरण के लिए, उदाहरण के लिए, विकास चक्र के दौरान, मैं त्रुटि जानकारी ट्रैक कर रहा हूं जो डीबग.राइट लाइन का उपयोग कर आउटपुट विंडो में कनेक्शन को लॉग कर सकता है। विकास के दौरान यह स्पष्ट रूप से ठीक है, लेकिन मुझे आश्चर्य है कि अगर मैं लाइव हूं, तो यहां जोखिम है। क्या कोई मेरे लाइव निष्पादन योग्य को डीबगर संलग्न कर सकता है और इस आउटपुट को जाल कर सकता है? या यह ऐसा कुछ है जो केवल विजुअल स्टूडियो में आउटपुट उत्पन्न करता है?

और जब हम डीबग से रिलीज करने के लिए स्विच करते हैं तो क्या होगा? अगर हम रिलीज के लिए संकलित करते हैं तो क्या इस कोड को संकलक द्वारा अनदेखा किया जाता है?

+1

उत्तर देने वाले सभी का धन्यवाद।@ फिल देवानी, @ मिच गेहट, और @ एजेंट 9 9 1 1 ने सभी ने अलग-अलग शब्दों में एक ही जवाब दिया, इसलिए मैं आपको सभी को वोट दे रहा हूं, लेकिन मैं केवल एक जवाब स्वीकार कर सकता हूं। मैं उन लोगों के साथ जाऊंगा जिन्होंने पहले जवाब दिया था, लेकिन यह एक टाई बेटी एन मिच और फिल के रूप में दिखता है, इसलिए कोई अपराध नहीं, मिच, लेकिन मैं इसे फिल को देने जा रहा हूं, जिनके अंक कम हैं। – David

+0

दूसरों को निम्नलिखित के लिए खोज [डेबग। राइटलाइन में रिलीज बिल्ड] [http://stackoverflow.com/questions/5419534/debug-writeline-in-release-build) भी दिलचस्प साबित हो सकता है। '12 कोड दर्ज करें 'छोड़ने के लिए –

उत्तर

66

डीबग कक्षा के सभी सदस्यों को ConditionalAttribute के साथ चिह्नित किया गया है, इसलिए कॉल साइट को रिलीज़ बिल्ड में संकलित नहीं किया जाएगा।

+23

मेरी इच्छा है कि प्रत्येक बार एक सहकर्मी ने डीबग बिल्ड के साथ एक उत्पादन इंस्टॉलर भेजा हो। – MusiGenesis

17

System.Diagnostics.Debug विधि कॉल केवल तब मौजूद होते हैं जब "DEBUG" सशर्त संकलन प्रतीक परिभाषित किया जाता है। डिफ़ॉल्ट रूप से, "DEBUG" प्रतीक केवल डीबग बिल्ड के लिए परिभाषित किया जाता है।

संकलनकर्ता कि ConditionalAttribute समर्थन के लिए कॉल की अनदेखी इन तरीकों जब तक "डीबग" एक सशर्त संकलन प्रतीक के रूप में परिभाषित किया गया है।

+1

+1 :) –

11

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

+2

अधिक विशेष रूप से, 'DEBUG' को परिभाषित न करें। यदि आप "रिलीज" बिल्ड (न्यूनतम प्रतीकों, अनुकूलित कोड इत्यादि) बनाते हैं लेकिन 'DEBUG 'को परिभाषित करते हैं, तो' डीबग 'विधियों को अभी भी कॉल किया जाएगा, है ना? –

1

डीबग के लगभग सभी सदस्यों को ConditionalAttribute के साथ चिह्नित किया गया है। सी # के रूप में ऐसे कंपाइलर रिलीज बिल्ड के दौरान उन विधियों पर कॉल छोड़ देंगे, इसलिए आप सुरक्षित पक्ष पर हैं।

मोड यहाँ जानकारी: http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

2

आप /d:DEBUG विकल्प या #define DEBUG बिना संकलन, अपने WriteLine कॉल शारीरिक रूप से आपके रिहाई कोड में मौजूद नहीं होगा प्रदान करना; इन कॉलों से किसी भी तीसरे पक्ष को किसी भी जानकारी को पुनर्प्राप्त करने का कोई तरीका नहीं है, क्योंकि वे वास्तव में रिलीज संस्करण में नहीं हैं।

अधिक यहाँ विवरण: Debug Class (System.Diagnostics) on MSDN

6

डिबग जानकारी केवल दिख रहा है जब आप डीबग मोड में चला रहे हैं। रिलीज मोड कोई डीबग स्टेटमेंट दिखाई नहीं देगा (आप के बजाय का उपयोग कर सकते हैं यदि आप इन बयानों को रिलीज़ मोड में दिखाना चाहते हैं)।

http://support.microsoft.com/kb/815788

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