2017-10-20 8 views
9

मेरे पास कुछ कोड है जो रिलीज बिल्ड और डीबग बिल्ड के बीच अलग-अलग व्यवहार करता है। यह डीबग में सही ढंग से व्यवहार करता है लेकिन रिलीज में नहीं।यह प्रोग्राम रिलीज बिल्ड में अगर ब्लॉक में प्रवेश करता है लेकिन डीबग बिल्ड में क्यों नहीं है?

मेरे पास एक ऐसा फ़ंक्शन है जो ReadOnlyCollection<MyCustomClass> देता है।

 var result = new List<MyCustomClass>(); 
     ... 
     var list1 = this.returnEmptyList(); 
     var list2 = this.returnListWithOneItem(); 
     if (list1.Count == 0 && list2.Count == 0) 
     { 
      functionOutVariable = string.Empty; 
      return result.AsReadOnly(); 
     } 

समस्या निवारण के प्रयोजनों मैं कोड को सरल बनाया और एक सामान्य फैशन में चर नाम दिया है के लिए, और तरीकों returnEmptyList और returnListWithOneItem यहां दिए गए हैं:: एक अनुभाग यह है जाहिर है

private List<string> returnEmptyList() 
    { 
     return new List<string>(); 
    } 

    private List<string> returnListWithOneItem() 
    { 
     return new List<string> {"something"}; 
    } 

यह if ब्लॉक में प्रवेश कभी नहीं करना चाहिए क्योंकि list2.Count हमेशा 1 होना चाहिए, लेकिन जब मैं एक रिलीज के निर्माण में इस पर अमल, यह करता:

enter image description here

तो वहाँ स्पष्ट रूप से कुछ अनुकूलन के बाद से आप देख सकते हैं कि list1 दुर्गम है चल रहा है, और जब यह के माध्यम से आगे बढ़ लाइन 416 निष्पादित और फिर तुरंत कूद गया 421. लाइन मैं जानकारी देनी होगी कि मेरी समाधान उपयोग में सभी विधानसभाओं। नेट फ्रेमवर्क 4.6.2, और मैं विजुअल स्टूडियो 2017 संस्करण 15.3.5 चला रहा हूं।

जब मैं डीबग और इस पर अमल करने का निर्माण बदलने के लिए, यह लाइन 416, 417 निष्पादित करता है, और लाइन 418 पर यह पता चलता है list1.Count 0 और list2.Count 1 है, और इसे सही ढंग से नहींif ब्लॉक में प्रवेश करता है।

मैं इसे पुन: उत्पन्न करने के लिए एक परीक्षण प्रोजेक्ट बनाने की कोशिश कर रहा हूं लेकिन मैं नहीं कर सकता। मैं इसके निचले भाग तक पहुंचने के लिए किसी भी तरह की तलाश में हूं। मुझे सिर्फ एक फिक्स नहीं चाहिए जो इसे दूर कर दे - मुझे यह समझने की ज़रूरत है कि मैं क्या गलत कर रहा हूं।

+1

यह कंपाइलर में एक बग की तरह लगता है। क्या आप प्रत्येक निर्माण में संकलित आईएल पोस्ट कर सकते हैं? – SLaks

+1

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

+1

और बाद में आप इस फ़ंक्शन में क्या करते हैं, यदि "if" ब्लॉक दर्ज नहीं किया गया है? – Evk

उत्तर

7

ठीक है, मुझे पूरा यकीन है कि यह मेरे शेष कार्य में एक सूक्ष्म बग का परिणाम है जिसने संकलक को केवल ब्लॉक को अनुकूलित करने और जल्दी लौटने की अनुमति दी है। मैं इस परीक्षण परियोजना में डिबगर के व्यवहार को पुनः सकता है, और यह पूरी तरह से इस मामले में समझ में आता है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new MyClass(); 
     test.DoTest(out var result); 
     Console.WriteLine(result); 
     Console.ReadKey(); 
    } 
} 

class MyClass 
{ 
    public ReadOnlyCollection<MyCustomClass> DoTest(out string functionOutVariable) 
    { 
     var result = new List<MyCustomClass>(); 
     var list1 = this.returnEmptyList(); 
     var list2 = this.returnListWithOneItem(); 
     if (list1.Count == 0 && list2.Count == 0) 
     { 
      functionOutVariable = string.Empty; 
      return result.AsReadOnly(); 
     } 
     functionOutVariable = string.Empty; 
     return result.AsReadOnly(); 
    } 

    private List<string> returnEmptyList() 
    { 
     return new List<string>(); 
    } 

    private List<string> returnListWithOneItem() 
    { 
     return new List<string> { "something" }; 
    } 
} 

class MyCustomClass 
{ 

} 

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

enter image description here

संपादित करें: मैं conf है इशारा हुआ उस समारोह में बाद में एक बग था जो मेरी समस्या का कारण बन रहा था, और रिलीज बिल्ड कोड को देखते समय डीबगर का व्यवहार सिर्फ संकलन अनुकूलन के कारण मुझे भ्रम पैदा कर रहा था।

स्पष्ट होने के लिए, मेरा प्रश्न गलत है: फ़ंक्शन वास्तव में एक ही परिणाम दे रहा था रिलीज और डीबग बनाता है लेकिन मुझे गलत था। ऐसा इसलिए है क्योंकि मैंने इस (दोषपूर्ण) अनुक्रम का पालन किया:

  1. मेरे पास एक असफल परीक्षण (रिलीज बिल्ड के खिलाफ) था।
  2. मैंने डीबगर (अभी भी रिलीज बिल्ड में) के साथ परीक्षण चलाया और इसे स्पष्ट रूप सेif ब्लॉक में गलत तरीके से चला गया।
  3. मैंने फिर डीबग के निर्माण को स्विच किया और डीबगर के साथ परीक्षण चलाया और इसे if ब्लॉक पर कदम रखा। मैंने माना (गलत तरीके से) कि मेरी समस्या का स्रोत था।

जिसने मुझे ऊपर देखा जंगली हंस चेस पर भेजा। अपना समय बर्बाद करने के लिए खेद है, लेकिन मुझे निश्चित रूप से व्यायाम को जानकारी मिली। शायद भविष्य में मेरी गलती से कोई और सीख जाएगा। :)

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