2013-10-24 6 views
17

में कोशिश-पकड़ क्लॉज मैं सी ++ में एक प्रोग्राम लिख रहा हूं। कार्यक्रम Win32 (x86) के लिए ठीक काम कर रहा है, और हाल ही में मैंने इसे x64 के लिए मूल रूप से संकलित करने का प्रयास किया है। बेशक, सामान तुरंत काम नहीं किया था।सी ++ अपवाद "स्किप्स" एमएसवीसी x64

समस्या को दूर करने के बाद, मैं इस सरल कोड स्निपेट के साथ पुन: पेश करने में कामयाब रहे है:

class MyException { }; 

int main() 
{ 
    try { 
     for (;;) { 
      try { 
       std::cout << "Throwing" << std::endl; 

       throw MyException(); 

       if (1 == 0) { 
        continue; 
       } 
      } catch (const MyException&) { 
       std::cout << "Catch 1" << std::endl; 
      } 
     } 
    } catch (const MyException&) { 
     std::cout << "Catch 2" << std::endl; 
    } 

    std::cout << "Done" << std::endl; 

    return 0; 
} 

(मैं if (1==0) खंड जल्द ही समझाएंगे) जब इस कोड के लिए MSVC का उपयोग कर संकलन x86 (मैंने 2010 का उपयोग किया है), परिणाम अपेक्षित है:

Throwing 
Catch 1 
Throwing 
Catch 1 
Throwing 
Catch 1 
Throwing 
Catch 1 
... 

और इसी तरह, एक अनंत लूप में।

हालांकि, में 64 परिणामों के लिए इस कोड संकलन:

Throwing 
Catch 2 
Done 

अपवाद पूरी तरह से आंतरिक पकड़ खंड को छोड़ देता है!

यह तब होता है जब if (1 ==0) खंड मेरे कोड में मौजूद होता है। जब मैं इसे हटा देता हूं, तो अपवाद को "कैच 1" में पकड़ा जाता है।

मैं अन्य कम्पाइलरों के उपयोग की कोशिश की है:

  • इस बग भी अपेक्षा के अनुरूप वी.एस. 2012
  • MinGW और MinGW-W64 काम में होता है।

मेरा प्रश्न: क्या यह एक एमएसवीसी बग है, या यह सी ++ में कुछ अपरिभाषित व्यवहार है, मुझे याद आ रही है? यदि यह वास्तव में एक एमएसवीसी बग है, तो मुझे कारण पर कुछ अंतर्दृष्टि सुनना अच्छा लगेगा।

धन्यवाद।

+3

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

+3

अच्छा लगता है! मुझे अभी जाना है सबसे पहले, यह 64-बिट रिलीज बिल्ड पर लिंकर को क्रैश करता है। दूसरा, मैं इसे 'जारी रखने' के साथ पुन: पेश कर सकता हूं। इसके आसपास 'if' कथन अनावश्यक है। वीएस2012 अपडेट का उपयोग 3. – Steve

+1

मैंने [एमएस कनेक्ट] पर एक बग रिपोर्ट खोली है (https://connect.microsoft.com/VisualStudio/feedback/details/806490/c-exception-skips-try-catch-clause-in -msvc-64)। –

उत्तर

0

स्विच/एफएएस स्विच का प्रयास करें:

http://msdn.microsoft.com/en-us/library/367y26c6%28v=vs.80%29.ASPX

में "अतिरिक्त आउटपुट फ़ाइल" अपने "संकलक सेटिंग" में कहीं। (सुनिश्चित करें कि अन्य सभी सेटिंग्स सैम हैं)

फिर, दोनों आउटपुट के बीच एक अंतर करें। यहाँ diff पोस्ट करें। मुझे यकीन है कि कुछ लोग आपको बताएंगे कि क्यों और कैसे, और शायद कुछ कंपाइलर सेटिंग्स या कोड वर्कअराउंड।

1

इस बग में कंपाइलर अनुकूलन के साथ कुछ करने का हो सकता है - यह दिलचस्प है कि लिंकर आपके रिलीज बिल्ड में क्रैश हो जाता है (जब पूर्ण अनुकूलन सैद्धांतिक रूप से चालू हो जाएगा)।

क्या आपके डीबग बिल्ड में ऑप्टिमाइज़ेशन पूरी तरह अक्षम है (/ ओडी)?

विजुअल स्टूडियो सहायता में 64-बिट कोड में प्रयास/पकड़ने वाले ब्लॉक को "ऑप्टिमाइज़ेशन बेस्ट प्रैक्टिस" के तहत एक कथन भी शामिल है।

यदि आप रिलीज बिल्ड में ऑप्टिमाइज़ेशन बंद करते हैं, तो लिंकर क्रैश नहीं होता है। यदि आप केवल "जारी रखें" कथन को हटाते हैं तो यह भी क्रैश नहीं होगा (लेकिन खराब व्यवहार को पुन: उत्पन्न करेगा)।

if (1==0) { 
//continue; 
} 
0

यह एक पुराना ज्ञात मुद्दा है, इसे खोदने के बाद यह कुछ समय पहले हमने पाया था।

http://social.msdn.microsoft.com/Forums/en-US/19eb8218-0dc4-4e4f-954f-4c4c3b3cd118/why-am-i-not-being-alerted-of-exceptions-from-methods-that-are-run-when-the-application-loads?forum=csharpide

+0

लिंक सी # मुद्दे पर है - सवाल सी ++ के बारे में है – Tom

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