2012-08-25 15 views
7

रिलीज मोड और डीबग मोड के बीच क्या अंतर है?मेरा एप्लिकेशन रिलीज मोड में क्यों क्रैश होता है लेकिन डीबग मोड में नहीं?

और मैं असफल होने के लिए रिलीज मोड में डीबग कैसे कर सकता हूं?

class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainWindow()); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Main : "+ex.Message, typeof(Program)); 
      MessageBox.Show(ex.Message + ex.StackTrace); 
      Environment.Exit(1); 
     } 
    } 
} 

उत्तर

7

आपके स्निपेट में कैच क्लॉज कभी भी आपके ऐप के शिपिंग संस्करण में कुछ भी नहीं पकड़ पाएगा। यह काम करता है जब आप इसे डीबगर संलग्न करते हैं।

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

कोड को उसी तरह से व्यवहार करने के लिए, आपको अनचाहे अपवाद हैंडलिंग रणनीति को बदलने की आवश्यकता होगी। इस तरह:

[STAThread] 
    static void Main() { 
     try { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) { 
      // etc.. 
     } 
    } 

अब आपका पकड़ खंड हमेशा अपवाद को पकड़ लेगा। जब तक यह मुख्य धागे पर उठाया जाता है, तब तक यह कार्यकर्ता धागे में उठाए गए अपवादों को नहीं पकड़ पाएगा। एकीकृत से निपटने के लिए के बजाय इस कोड पर विचार करें:

[STAThread] 
    static void Main() { 
     AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions; 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
     Application.Run(new Form1()); 
    } 

    private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) { 
     var ex = (Exception)e.ExceptionObject; 
     // Display or log ex.ToString() 
     //... 
     Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)); 
    } 
+0

आपकी महान सलाह के लिए धन्यवाद – armin

+0

क्या यह डब्ल्यूपीएफ या सिर्फ विंडोज फॉर्म में काम करता है? –

2

वहाँ कई कारण यह भी हो सकता है, और कई पेशेवरों है कि है कि एक क्लासिक किसी भी आवेदन के बग, प्रतीत होता है कि जब आप वाकई सब कुछ ठीक हो wrks है की पुष्टि कर सकते हैं, लेकिन क्लाइंट मशीन पर कर रहे हैं कुछ भी काम नहीं करता है।

यह कहना मुश्किल है कि प्रश्न में दिए गए अपवाद विवरण के बिना ऐसा क्यों होता है।

जिस तरह से आप विजुअल स्टूडियो से इसे संलग्न करके अपने आवेदन को डीबग कर सकते हैं।

How to: Attach to a Running Process

+0

अपने जवाब के लिए धन्यवाद, लेकिन क्यों मेरे कोड ऊपर भी इस अपवाद को पकड़ने नहीं है कि आप व्याख्या कर सकते हैं यह सिर्फ, दुर्घटनाओं अपवाद नहीं messageboxes या कुछ भी – armin

+0

क्या करता है @armin नहीं? EventViewer कहते हैं? –

+1

वैसे, ऐसे अपवाद हैं जो उदाहरण के लिए 'स्टैक ओवरफ्लो' जैसे 'प्रयास/पकड़' द्वारा गले लगाए जा सकते हैं। 'इवेंट व्यूअर' देखें, जैसे एलबी सुझाव देता है, या [प्रथम मौका अपवाद सक्षम करें] (http://florianreischl.blogspot.it/2010/01/how-to-enable-first-chance-exceptions.html) यह देखने के लिए कि कहां और कहाँ क्या होता है। – Tigran

0

डीबग और जारी मोड अपने कोड के निर्माण के लिए दो अलग-अलग तरीके हैं। चूंकि आपके द्वारा उपयोग किए जाने वाले लगभग हर विकास पर्यावरण के लिए विशिष्ट तरीके अलग-अलग हैं, इसलिए तुरंत बताना असंभव है। मोड को मोड 1 & मोड 2 भी कहा जा सकता है।

हालांकि, आपका डीबग मोड शायद आपकी बाइनरी में डीबग जानकारी (प्रतीक सारणी, रेखा क्रमांकन इत्यादि) संकलित करता है जहां रिलीज़ नहीं होता है। लेकिन हजारों मतभेद हो सकते हैं।

यह जानने का प्रयास करें कि डीबग/रिलीज मोड निर्दिष्ट किए गए हैं और आपको अंतर मिलेगा!

0

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

निर्देशों के लिए this Microsoft kb article देखें।

रिलीज और डीबग मोड के पीछे एक विचार करने के लिए के रूप में:

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

अंतर जानने का सबसे अच्छा तरीका बस अपनी परियोजना बनाएं संपत्तियां बनाएं (अपनी प्रोजेक्ट पर राइट क्लिक करें, गुण चुनें, फिर बाईं ओर स्थित बिल्ड टैब पर क्लिक करें)। कॉन्फ़िगरेशन के आधार पर बदल सकते हैं कि सभी अलग-अलग विकल्पों को देखें।

डीबग बनाम रिलीज के साथ एक और आम समस्या सही एक्शन को अपने प्रोजेक्ट आइटमों जैसे कॉन्फ़िगरेशन फ़ाइल या एम्बेडेड संसाधन पर सेट करें।

2

मेरा अनुभव मुझे बताता है कि आपको कोड की तलाश करनी चाहिए जहां आप किसी भी प्रकार की सेटिंग्स को संभालते हैं।

आप रजिस्ट्री में कोई सेटिंग और application.config में कोई सेटिंग के साथ एप्लिकेशन को डीबग करके शुरू कर सकते हैं।

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

दूसरा चरण आपके आवेदन को आपके कंप्यूटर पर डिबग करना होगा।

आशा है कि इससे आपकी खोज में मदद मिलेगी।

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