क्या मुझे "पूर्ण" या "पीडीबी-ओनली" के रूप में डिबग जानकारी के साथ रिलीज का संकलन करना चाहिए?


114

C # प्रोजेक्ट के लिए Visual Studio 2010 में, यदि आप प्रोजेक्ट गुण> बिल्ड> एडवांस> डीबग इंफो पर जाते हैं, तो आपके पास तीन विकल्प हैं: कोई नहीं, पूर्ण या केवल पीडीबी। इस प्रश्न के उत्तर के आधार पर , मेरा मानना ​​है कि मैं पूर्ण और पीडीबी-केवल के बीच कुछ अंतरों को समझता हूं। हालाँकि, रिलीज़ बिल्ड के लिए कौन अधिक उपयुक्त है? यदि मैं "पूर्ण" का उपयोग करता हूं तो क्या प्रदर्शन में व्यवधान होंगे? अगर मैं "पीडीबी-ओनली" का उपयोग करता हूं तो क्या उत्पादन मुद्दों पर बहस करना कठिन होगा?

"पूर्ण" और "pdbonly" के बीच अंतर क्या है? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option


Pdb- केवल या कोई नहीं, हमेशा रिलीज़ बिल्ड के लिए।
लीपी

13
@leppie धन्यवाद, लेकिन मैं उस स्थिति के कुछ औचित्य की तलाश कर रहा हूं।
RationalGeek

संबंधित प्रश्न: stackoverflow.com/questions/1270986/…
janv8000

अगर कोई प्रदर्शन प्रभाव नहीं है तो यह बहुत अच्छा है। स्मृति प्रभाव के बारे में क्या? यदि मैं StackTrace का एक उदाहरण बनाता हूं और फ़ाइल जानकारी का अनुरोध करता हूं, तो इसे पीडीबी प्रतीक डेटा से आना होगा। क्या सभी प्रतीक आवेदन शुरू होने पर मेमोरी में लोड हो जाते हैं? इस का अनुमानित मेमोरी उपयोग क्या है? (जैसे कोड आकार के सापेक्ष प्रतिशत उपरि।)
योयो

जवाबों:


90

मैं के साथ निर्माण होगा pdb-only। आप जारी किए गए उत्पाद में डिबगर संलग्न नहीं कर पाएंगे, लेकिन यदि आपको क्रैश डंप मिलता है, तो क्रैश के समय स्टैक के निशान और मेमोरी डंप की जांच करने के लिए आप विजुअल स्टूडियो या WinDBG का उपयोग कर सकते हैं ।

यदि आप इसके fullबजाय जाते हैं pdb-only, तो आपको वही लाभ मिलेंगे, सिवाय इसके कि निष्पादन योग्य सीधे डिबगर से जुड़ा हो सकता है। आपको यह निर्धारित करने की आवश्यकता होगी कि क्या यह आपके उत्पाद और ग्राहकों को उचित है।

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

यदि आप निर्माण करना चुनते हैं none, तो क्षेत्र में कोई दुर्घटना होने पर आपको कोई सहारा नहीं मिलेगा। आप किसी भी प्रकार की दुर्घटना के बाद की परीक्षा को नहीं कर पाएंगे, जिससे समस्या को ट्रैक करने की आपकी क्षमता में गंभीर बाधा आ सकती है।

प्रदर्शन के बारे में एक नोट:

दोनों जॉन रॉबिंस और एरिक Lippert के बारे में ब्लॉग पोस्ट में लिखा है /debugझंडा, और वे दोनों संकेत मिलता है कि इस सेटिंग है शून्य प्रदर्शन प्रभाव । एक अलग /optimizeझंडा है जो यह निर्धारित करता है कि संकलक को अनुकूलन करना चाहिए या नहीं।


7
@Matt, / डीबग स्विच पर MSDN आलेख स्पष्ट रूप से 'पूर्ण' सेटिंग का उपयोग करने के प्रदर्शन प्रभाव के बारे में चेतावनी देता है:If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
Allon Guralnek

3
@ मैट: अगर 'पीडीबी-ओनली' की तुलना में 'पूर्ण' को कोई नुकसान नहीं है, लेकिन केवल फायदे हैं, तो 'पीडीबी-ओनली' भी मौजूद क्यों है? क्या any पूर्ण ’पर इसका उपयोग करने का कोई कारण है? साथ ही, आपको 'सामुदायिक सामग्री' अनुभाग में MSDN लेख में सुधार जोड़ना चाहिए।
एलोन गुरिलनेक

9
लिंक जॉन रॉबिंस लेख से @AllonGuralnek उद्धरण: वास्तविक कारण: इतिहास। .NET 1.0 में वापस मतभेद थे, लेकिन .NET 2.0 में ऐसा नहीं है। ऐसा लगता है कि .NET 4.0 उसी पैटर्न का अनुसरण करेगा। सीएलआर डिबगिंग टीम के साथ डबल-चेकिंग के बाद, कोई अंतर नहीं है।
बेंटायलरुक

5
यह सच नहीं है। आप pdb के साथ ही निर्माण कर सकते हैं और अभी भी डिबगर संलग्न कर सकते हैं। मैंने सिर्फ यह सुनिश्चित करने के लिए किया था।
मार्क

2
"मैं पीडीब-ओनली के साथ निर्माण करूंगा। आप जारी किए गए उत्पाद के लिए डिबगर संलग्न नहीं कर पाएंगे" यहां आपकी जानकारी का स्रोत क्या है? जैसा कि @Mark और मैंने नोट किया है, यह सही नहीं लगता है।
मेम्ार्क

66

चेतावनी MSDN प्रलेखन / डिबग स्विच के लिए (विजुअल स्टूडियो में यह डीबग जानकारी है) के बाहर के तारीख प्रतीत हो रहा है! यह वही है जो गलत है

यदि आप / डिबग: पूर्ण का उपयोग करते हैं , तो ध्यान रखें कि JIT अनुकूलित कोड की गति और आकार पर कुछ प्रभाव पड़ता है और कोड गुणवत्ता पर एक छोटा प्रभाव / डीबग के साथ: पूर्ण । हम अनुशंसा करते हैं / डीबग करें: रिलीज़ कोड जनरेट करने के लिए pdbonly या कोई PDB।

/ डीबग: pdbonly और / debug के बीच एक अंतर : पूर्ण यह है कि / डिबग के साथ: पूर्ण कंपाइलर एक का उत्सर्जन करता है DebuggableAttribute, जिसका उपयोग JIT कंपाइलर को यह बताने के लिए किया जाता है कि डिबग जानकारी उपलब्ध है।

फिर, अब क्या सच है?

  1. Pdb-only - .NET 2.0 से पहले, यह रिलीज़ किए गए उत्पाद (ग्राहक मशीनों) से क्रैश डंप की जांच करने में मदद करता था। लेकिन इसने डिबगर को संलग्न नहीं होने दिया। .NET 2.0 से ऐसा नहीं है। यह है बिल्कुल के रूप में ही पूर्ण
  2. पूर्ण - यह हमें क्रैश डंप की जांच करने में मदद करता है, और हमें बिल्ड रिलीज करने के लिए डिबगर को संलग्न करने की भी अनुमति देता है। लेकिन MSDN के विपरीत, यह प्रदर्शन को प्रभावित नहीं करता (.NET 2.0 के बाद से)। यह बिल्कुल Pdb के समान है ।

यदि वे बिल्कुल समान हैं, तो हमारे पास ये विकल्प क्यों हैं? जॉन रॉबिंस (विंडोज़ डिबगिंग गॉड) ने पाया कि ये ऐतिहासिक कारणों से हैं।

.NET 1.0 में वापस मतभेद थे, लेकिन .NET 2.0 में ऐसा नहीं है। ऐसा लगता है कि .NET 4.0 उसी पैटर्न का अनुसरण करेगा। सीएलआर डिबगिंग टीम के साथ डबल-चेकिंग के बाद, कोई अंतर नहीं है।

क्या नियंत्रित करता है कि क्या जेटर एक डिबग बिल्ड करता है / स्विच स्विच। <...>

लब्बोलुआब यह है कि आप अपनी रिलीज़ बिल्ड / ऑप्टिमाइज़ + और किसी भी / डीबग स्विच के साथ बनाना चाहते हैं ताकि आप स्रोत कोड के साथ डीबग कर सकें।

फिर वह इसे साबित करने के लिए आगे बढ़ता है।

अब अनुकूलन एक अलग स्विच का हिस्सा है /optimize(दृश्य स्टूडियो में इसे कहा जाता है Optimize code)।

संक्षेप में, डीबगइन्फो की स्थापना pdb-only या पूर्ण के बावजूद, हमारे पास एक ही परिणाम होंगे। सिफारिश यह है कि किसी को भी इससे बचना चाहिए क्योंकि यह आपको जारी उत्पाद से क्रैश डंप का विश्लेषण करने या डीबगर संलग्न करने से वंचित करेगा।


3
शानदार जवाब! मेरी स्वयं की जांच (उत्पन्न फ़ाइलों की तुलना) समान परिणाम दिखाती है।
मेम्ार्क

@rpattabi क्या आप संदर्भ निर्दिष्ट कर सकते हैं कि pdbonly और full समान हैं? यह 2019 है और प्रलेखन अभी भी इंगित करता है कि वे अलग हैं और पूर्ण प्रदर्शन में गिरावट होगी। और VS2019 Releaseडिफ़ॉल्ट रूप से सेट द्वारा कॉन्फ़िगरेशन के डिबगाइप के साथ प्रोजेक्ट बनाता है pdbonly
जो

@joe MSDN प्रलेखन msdn.microsoft.com/en-us/library/8cw0bt21.aspx के निचले भाग पर एक चर्चा है । इस पर एक नज़र मारो। एक योगदानकर्ता ने अप-टू-डेट जानकारी के लिए github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/… को इंगित किया जहां pdbonly और full को समान रूप से उल्लेखित किया गया है। (FYI करें। मैं अब विंडोज़ या वी.एस. का उपयोग नहीं करता हूं। इसलिए मैं वहां का पालन नहीं कर रहा हूं। लेकिन जैसा कि मैंने समीक्षा की, मेरे जवाब में जानकारी अभी भी प्रासंगिक है और MSDN डॉक अभी भी गलत है।)
rpattabi

16

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

पूर्ण डीबग आपके कोड में [डीबग करने योग्य] विशेषता जोड़ता है। इससे गति पर बहुत अधिक प्रभाव पड़ता है। उदाहरण के लिए, सिंगल स्टेपिंग को आसान बनाने के लिए कुछ लूप ऑप्टिमाइज़ेशन को निष्क्रिय किया जा सकता है। इसके अलावा, जेआईटी प्रक्रिया पर इसका थोड़ा प्रभाव पड़ता है, क्योंकि यह ट्रैकिंग को चालू करता है।


समझ में आता है। मैं वास्तव में उपयोगकर्ताओं को DLL को किसी भी तरह से वितरित नहीं करता - यह एक ASP.NET ऐप है। लेकिन क्या आप अपने उत्तर को बढ़ा सकते हैं और उचित ठहरा सकते हैं कि आपको "पीडीबी केवल" बनाम "पूर्ण" के साथ क्यों जाना चाहिए? क्या यह प्रदर्शन का मुद्दा है?
RationalGeek

@jkohlhepp: मैं जोड़ना चाहूंगा, हालांकि डिबगिंग रिलीज़ बिल्ड थोड़ा मुश्किल है क्योंकि आप कुछ जानकारी (JIT के कारण) खो देंगे। लगभग हमेशा, आप विधि तर्कों के मूल्यों को देखने में सक्षम नहीं होंगे। इसे हल करने के लिए, आप अस्थायी रूप से इसका उपयोग करके JIT ऑप्टिमाइज़ेशन को अक्षम कर सकते हैं ।
इलियान पिनज़ोन

अतिरिक्त जानकारी के लिए धन्यवाद ब्लर्डार्ट और धन्यवाद इलियान पिनज़ोन। मुझे पता है कि आपको रिलीज़ कोड के साथ सही डिबगिंग नहीं मिल सकती है, लेकिन PDB होने से बेहतर कुछ नहीं है।
RationalGeek

"पूर्ण" सेटिंग का उपयोग करने पर प्रदर्शन प्रभाव नहीं पड़ता है। यह बस डिबगर को रनिंग प्रक्रिया से जुड़ा होने देता है।
मैट डिलार्ड

1
MSDN मैट, msdn.microsoft.com/en-us/library/8cw0bt21 पर अच्छा प्रश्न, स्वयं उत्तर की प्रतीक्षा कर रहा है।
ल्यूक हट्टन

4

मैं एक अखंड अपवाद हैंडलर लिखने की प्रक्रिया में हूं और स्टैक ट्रेस में लाइन नंबर शामिल है जब pdb-only का उपयोग किया जाता है, अन्यथा मुझे कोई भी चुनने पर सब / फ़ंक्शन का नाम मिलता है।

अगर मैं .pdb वितरित नहीं करता हूं तो मुझे pdb-only बिल्ड के साथ भी स्टैक ट्रेस में लाइन नंबर नहीं मिलता है।

तो, मैं वितरित कर रहा हूँ (XCOPY एक लैन पर तैनात) pdb के साथ साथ मेरे VB ऐप से exe।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.