दृश्य स्टूडियो में डीबग और रिलीज़ के बीच अंतर क्या है?


जवाबों:


114

सबसे महत्वपूर्ण बात यह है कि डिबग मोड में कोई अनुकूलन नहीं हैं, जबकि रिलीज़ मोड में अनुकूलन हैं। यह महत्वपूर्ण है क्योंकि कंपाइलर बहुत उन्नत है और आपके कोड के कुछ सुंदर कम-स्तरीय सुधार कर सकता है। परिणामस्वरूप आपके कोड की कुछ पंक्तियाँ बिना किसी निर्देश के छोड़ दी जा सकती हैं, या कुछ सभी मिश्रित हो सकती हैं। चरण-दर-चरण डिबगिंग असंभव होगा। इसके अलावा, स्थानीय चर अक्सर रहस्यमय तरीके से अनुकूलित होते हैं, इसलिए घड़ियाँ और क्विकचैच अक्सर काम नहीं करते क्योंकि चर "अनुकूलित दूर" होता है। और अन्य अनुकूलन के भी कई दृष्टिकोण हैं। कुछ समय के लिए अनुकूलित .NET कोड डिबगिंग का प्रयास करें और आप देखेंगे।

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


1
"परिणामस्वरूप, आपके कोड की कुछ पंक्तियाँ बिना किसी निर्देश के छोड़ दी जा सकती हैं, या कुछ सभी को मिलाया जा सकता है"। YUP, मौजूदा पद्धति / संपत्ति का नाम प्राप्त करने के लिए स्टैक फ्रेम का उपयोग करके इस तरह से बेईमानी से गिर गया - और बहुत सारी संपत्तियों को रिलीज में मिला ...
kpollock

4
"सबसे महत्वपूर्ण बात यह है कि डिबग मोड में कोई अनुकूलन नहीं हैं" - यह तर्कपूर्ण है। सबसे महत्वपूर्ण बात यह है कि डिबग जानकारी है जो आपको डीबग करने की अनुमति देती है। हालांकि यह रिलीज में भी मौजूद हो सकता है।
शौच

मुझे नहीं पता कि डिफॉल्ट मोड (डिबग / रिलीज़) कौन सा है। आम तौर पर मेरे अनुभव में सभी परियोजनाएं डिबग मोड में हैं और पीडीएफ़ फ़ाइल से बचने के लिए, और अनुकूलन शुरू करने के लिए इंस्टॉलर टीम इस रिलीज़ का ध्यान रखेगी। लेकिन आज मैं एक ऐसी स्थिति में आया कि मोड को रिलीज़ करने के लिए बदल दिया गया है और मैं ब्रेक पॉइंट का उपयोग करके कोड को तोड़ने में सक्षम नहीं हूं। मैंने बहुत सारी चीजें करते हुए 1 घंटे की कोशिश की और आखिरकार मैंने नोटिस किया कि यह वर्तमान मोड के संकलन के मुद्दे के कारण है। @ Vlix- आपके उत्तर के लिए धन्यवाद।
kvvishnu

1
इससे मुझे वास्तव में "नाम 'वैरिएबल' मौजूदा संदर्भ में मौजूद नहीं है" को हल करने में मदद मिली "इश्यू" मैं तत्काल विंडो के भीतर एक प्रतीक का विश्लेषण करने की कोशिश करते हुए सामना करना पड़ा, जबकि डिफॉल्ट रिलीज कॉन्फ़िगरेशन के साथ एक आवेदन का अनुपालन करते हुए। आपका बहुत बहुत धन्यवाद!
M463

1) निम्नलिखित मुद्दों के बारे में क्या? ASP.NET MVC प्रोजेक्ट में 3 कॉन्फिगर हैं: बेस (वेब), डीबग (web.debug), रिलीज़ (web.release)। मान लें कि हम डिबग सेट और कनेक्शन स्ट्रिंग को संबंधित कॉन्फिगरेशन (डीबग और रिलीज़) में बदलकर सेट करते हैं। प्रकाशित करते समय, हम प्रकाशन संवाद में अपने चयन के अनुसार प्रकाशित कर सकते हैं। लेकिन, जब मैं डिबग का चयन करता हूं, तो रनिंग एप्लिकेशन, यह रिलीज कॉन्फिग का उपयोग करता है (बेस में डिबग कॉन्फिग को सेट करता है), क्या यह सामान्य है?
जेसन

52

"डीबग" और "रिलीज़" वास्तव में सेटिंग्स के एक पूरे स्लेव के लिए सिर्फ दो लेबल हैं जो आपके निर्माण और डिबगिंग को प्रभावित कर सकते हैं।

"डीबग" मोड में आपके पास आमतौर पर निम्नलिखित हैं:

  • प्रोग्राम डीबग डेटाबेस फ़ाइलें, जो आपको रन-टाइम के दौरान स्रोत में कार्यक्रम के निष्पादन का काफी बारीकी से पालन करने की अनुमति देती हैं।
  • सभी अनुकूलन बंद हो गए, जो आपको चर के मान का निरीक्षण करने और उन कार्यों को ट्रेस करने की अनुमति देता है जो अन्यथा अनुकूलित या लाइन किए गए हो सकते हैं
  • एक _DEBUG प्रीप्रोसेसर परिभाषा जो आपको कोड लिखने की अनुमति देती है जो रिलीज़ की तुलना में डिबग मोड में अलग तरह से कार्य करती है, उदाहरण के लिए ASSERTs को इंस्ट्रूमेंट करना जो केवल डीबगिंग के दौरान उपयोग किया जाना चाहिए
  • उन पुस्तकालयों से जोड़ना जिन्हें डिबगिंग विकल्पों के साथ भी संकलित किया गया है, जो आमतौर पर वास्तविक ग्राहकों (आकार और सुरक्षा के कारणों के लिए) पर लागू नहीं होते हैं

"रिलीज़" मोड में ऑप्टिमाइज़ेशन चालू हैं (हालांकि कई विकल्प उपलब्ध हैं) और _DEBUG प्रीप्रोसेसर परिभाषा परिभाषित नहीं है। आमतौर पर आप अभी भी पीडीबी फ़ाइलों को उत्पन्न करना चाहते हैं, क्योंकि यह रिलीज़ मोड में "डीबग" करने में सक्षम होने के लिए अत्यधिक उपयोगी है जब चीजें तेजी से चल रही हैं।


5
"सिर्फ दो लेबल" - वास्तव में, विजुअल स्टूडियो आपको अधिक बनाने की क्षमता देता है ! यह एक कार्यक्रम का परीक्षण करते समय असाधारण रूप से उपयोगी हो सकता है। उदाहरण के लिए, मैंने हाल ही में अपनी नौकरी के लिए एक कार्यक्रम लिखा था, जिसमें कमांड-लाइन से फ़ाइल नाम स्वीकार किए गए थे। मैंने अपनी कमांड-लाइन पार्सिंग का परीक्षण किया, लेकिन एक बार जो किया गया था, मैं हर दिन सीएमडी और फ़ाइलनामों की सूची के साथ गड़बड़ नहीं करना चाहता था; मैंने एक कॉन्फ़िगरेशन बनाया, जिसे मैं डमी कमांड-लाइन मानों की आपूर्ति करने और प्रोग्राम के व्यापार तर्क का परीक्षण करने के लिए सशर्त संकलन का उपयोग कर सकता था, जिसने मुझे कार्यक्रम के विकास पर बहुत तेज चलना चक्र दिया।
ब्रायन एस

9

डिबगिंग करते समय अधिकतर, डीबग में बहुत सी अतिरिक्त जानकारी उपयोगी होती है। रिलीज़ मोड में, यह सभी कट और प्रदर्शन के लिए कारोबार किया जाता है।


1) निम्नलिखित मुद्दों के बारे में क्या? ASP.NET MVC प्रोजेक्ट में 3 कॉन्फिगर हैं: बेस (वेब), डीबग (web.debug), रिलीज़ (web.release)। मान लें कि हम डिबग सेट और कनेक्शन स्ट्रिंग को संबंधित कॉन्फिगरेशन (डीबग और रिलीज़) में बदलकर सेट करते हैं। प्रकाशित करते समय, हम प्रकाशन संवाद में अपने चयन के अनुसार प्रकाशित कर सकते हैं। लेकिन, जब मैं डिबग का चयन करता हूं, तो रनिंग एप्लिकेशन, यह रिलीज कॉन्फिग का उपयोग करता है (बेस में डिबग कॉन्फिग को सेट करता है), क्या यह सामान्य है?
जेसन

2) डिबग या रिलीज़ मोड में एप्लिकेशन चलाते समय, वी.एस. बेस वेब कॉन्फिगर या संबंधित वेब कॉन्फिगरेशन (web.debug.confg या web.release.config) का उपयोग करता है?
जेसन

7

यदि आप प्रोजेक्ट संकलन विकल्पों में जाते हैं और उनकी तुलना करते हैं, तो आप देखेंगे कि अंतर क्या हैं।

मान लिया जाए कि सवाल देशी / सी ++ कोड के बारे में है (यह पूरी तरह से स्पष्ट नहीं है)

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


2
@Vilx: जब मैं पीछे हट गया, तो अभी तक कोई भी .net टैग नहीं था, केवल विजुअलस्टडियो। तो मैंने मान लिया कि यह C ++ है।
नीरज

6

इसके अलावा, जाहिर तौर पर, डिबग मोड डिबगिंग में मदद करने के लिए बहुत सारे अतिरिक्त धागे बनाता है। ये प्रक्रिया के जीवन भर सक्रिय रहते हैं, भले ही आप डिबगर संलग्न करें या नहीं। मेरा संबंधित प्रश्न यहां देखें ।


लेकिन केवल .NET के लिए (C ++ नहीं)?
पीटर मोर्टेंसन

6

यह संभवतः बहुत स्पष्ट रूप से ध्यान देने योग्य है, कि झंडे का निर्माण विभिन्न तर्क के लिए अनुमति देता है जिसका उपयोग केवल लॉगिंग और "कंसोल" मैसेजिंग को बदलने के लिए किया जाना चाहिए , लेकिन इसका दुरुपयोग किया जा सकता है और नाटकीय रूप से न केवल निम्न-स्तर, बल्कि वास्तविक व्यापार तर्क को बदल सकता है।


"... नाटकीय रूप से बदल ... वास्तविक व्यापार तर्क" - मेरे लिए एक बग की तरह लगता है! हमारे पास बहुत सारे सशर्त कोड हैं और यह वास्तव में समझना मुश्किल बनाता है। इसके अलावा, सशर्त कोड झंडे का प्रत्येक संयोजन अनिवार्य रूप से आपके सॉफ़्टवेयर का एक अलग संस्करण है जिसे शुद्धता और बुनियादी अखंडता सुनिश्चित करने के लिए परीक्षण किया जाना चाहिए। सॉफ़्टवेयर कोड के मेरे बाइबिल "कोड कम्प्लीट" के अनुसार, हमारा "प्राइम डायरेक्टिव" जटिलता का प्रबंधन है। (इसे हल करने के लिए हमारी # 1 समस्या है)। अंधाधुंध अधिक सशर्त झंडे जोड़ने से पहले लंबा और कठिन सोचो!
माइक्रोसेरोऑनडीडी

मेरी उक्त टिप्पणी इस जवाब पर लक्षित नहीं थी, विशेष रूप से जहां तक ​​अंतिम वाक्य जाता है ... यह सिर्फ एक अतिरिक्त बात थी जो मुझे लगा कि यहां आने वाले पाठकों को पढ़ना चाहिए।
माइक्रोसेरोऑनडीडी

6

यह भी ध्यान दें कि उदाहरण के लिए MFC का उपयोग करते समय , गैर-पुनर्वितरण DLL संस्करणों के विरुद्ध डीबग प्रोजेक्ट लिंक लिंक MFC90D.DLLजारी करते समय , जैसे redistributable संस्करणों के विरुद्ध लिंक बनाता है MFC90.DLL। यह संभवतः अन्य रूपरेखाओं के समान है।

इसलिए आप संभवतः गैर-विकास मशीनों पर डिबग-बिल्ड एप्लिकेशन चलाने में सक्षम नहीं होंगे।


बिल्कुल सच। एक ग्राहक के रूप में एक बार इस पर भाग गया। माई मशीन (टीएम) पर काम करता है।
मैट जैकबसेन

आप उन्हें वितरित करने में सक्षम हैं .. (न जाने क्या आपको अनुमति है)। उन्हें आपके आवेदन के सबफ़ोल्डर के नाम से अवगत कराना होगा।
एंड्रियास रीफ जूल

@ और मेरे उदाहरण के बारे में, "गैर-पुनर्वितरण" का अर्थ है कि Microsoft उन्हें वितरित करने की अनुमति नहीं देता है।
foraidt

4

मुझे इस प्रश्न पर भी उत्सुकता हुई जब मैंने एक मौजूदा रिलीज़ बिल्ड कॉन्फ़िगरेशन से कॉपी किए गए एप्लिकेशन को विकसित किया था।

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

मुझे लगा कि परियोजना विन्यास सिर्फ एक नाम और "सेटिंग्स के पूरे स्लीव" का चयन करने का एक सुविधाजनक तरीका है, जोरिस टिम्मरमैन उल्लेख। मैं तो बस क्या उन सेटिंग्स है कि मेकअप निर्माण विन्यास एक अनुकूलित के रूप में "foo" समारोह नामित किया जा सकता है की बुनियादी तथ्य जानना चाहता था रिहाई का निर्माण।

इसकी एक झलक यहां देखें। मैंने विजुअल स्टूडियो 2010 से खाली प्रोजेक्ट टेम्पलेट से एक नया VCXPROJ बनाया। मैंने तब इसे कॉपी किया और दोनों को संपादित किया, पहला डिबग कंटेंट और दूसरा रिलीज कंटेंट। यहां देखें प्रासंगिक अंतरों पर केंद्रित ...

खाली VCXPROJJ डिबग बनाम रिलीज़ अंतर

विज्ञप्ति

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

डीबग

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

यह दिलचस्प है कि लिंक अनुभाग में वे दोनों GenerateDebugInformationसच करने के लिए सेट हैं।


3

आप जो स्पष्ट अंतर देख सकते हैं, वह बाइनरी का आकार है। एक डीबग बिल्ड रिलीज़ बिल्ड की तुलना में एक बड़ा बाइनरी बनाता है।

डीबग में संकलित करते समय, प्रतीक तालिका को कोड फ़ाइल के संकलित ऑब्जेक्ट में जोड़ा जाता है जो डिबगिंग प्रोग्राम को इन बायनेरिज़ में टैप करने और ऑब्जेक्ट और वेरिएबल्स के मूल्यों तक पहुंचने की अनुमति देता है।

एक और अवलोकन अंतर यह है कि, रिलीज़ मोड में, बाइनरी डीबग मोड में रहते हुए एक घातक त्रुटि पर क्रैश हो जाएगा, यदि आप Visual Studio में एप्लिकेशन डीबग करना शुरू करते हैं, तो आप कॉल स्टैक की जांच कर सकते हैं जो आपको गलत बयान का सही स्थान बताता है। ।


-15

मुझे नहीं पता कि सटीक अंतर क्या हैं क्योंकि वास्तव में उस पर आसानी से कोई जानकारी उपलब्ध नहीं है।

लेकिन मुख्य रूप से मनाया गया अंतर यह है कि रिलीज़ संस्करण कभी-कभी परिणामी DLL फ़ाइल को दूषित कर देता है और इस प्रकार आपको एप्लिकेशन, वेब एप्लिकेशन को अनुपयोगी बना देता है।

दुख की बात है कि आपको डिबग बिल्ड को प्रोडक्शन में लगाना होगा। और हाँ, प्रकाशित करने के लिए आपको अच्छे पुराने FTP का उपयोग करना होगा।


7
यह प्रश्न का उत्तर कैसे देता है? और जब आप टाइप कर रहे हों तो कृपया ध्यान दें।
मिमी

मेरे पास एक समान मुद्दा था, कोड डिबग मोड में काम करता है, लेकिन रिलीज मोड में समस्या है। समस्या मेरे कोड में है। रिलीज़ संस्करण में आम समस्याओं के बारे में एक शानदार लेख है। हालांकि इससे दूसरों को भी मदद मिल सकती है।
वेहुई गुओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.