2010-02-26 10 views
6

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

तो ... रिलीज और डीबग मोड के बीच विजुअल स्टूडियो क्या बदलता है जो इस समस्या का कारण बनता है? (मैं वीएस प्रो 2008 का उपयोग कर रहा हूं।)

रहस्यमय रूप से, रिलीज मोड बहुत सारे विकास के लिए काम कर रहा था। यह हाल ही में बंद कर दिया।

उत्तर

10

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

Why does this floating-point calculation give different results on different machines?

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

अंतर क्यों? क्योंकि अप्रत्याशित संस्करण में सी # कंपाइलर अकसर अस्थायी मानों के लिए कोड उत्पन्न करता है जैसे कि वे स्थानीय चर थे; जिटर तो वास्तव में ढेर पर अस्थायी स्थानीय आवंटित करता है, और रजिस्टरों से अस्थायी मूल्य स्थानीय लोगों को लिखता है। फिर जब उन्हें इसकी आवश्यकता होती है, तो यह उन्हें अस्थायी लोगों से रजिस्टरों में वापस पढ़ता है। उस यात्रा से उच्च-परिशुद्धता रजिस्टर में केवल 64 बिट परिशुद्धता के लिए छोटा हो सकता है, जो परिशुद्धता के बिट्स खो देता है।

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

शुभकामनाएं। बग जो केवल रिलीज मोड में repro कुल दर्द हैं।

+0

शायद यह धागा एक अच्छा उदाहरण है: http://stackoverflow.com/questions/2225503 –

5

सबसे पहले, किसी भी #if (DEBUG) या #if (रिलीज) प्रागम्स दर्ज किए गए हैं। आपके पास एक या दूसरे में कोड हो सकता है जिसे कॉल किया जाना चाहिए या नहीं, इसलिए उन लोगों की खोज करें।

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

+0

सहमत हैं, यह असंभव है .NET अनुकूलन आपके कोड को मार रहा है लेकिन आपके पास आपके कोड में प्रगति सशर्त हो सकते हैं जो निष्पादन पथ और इसलिए व्यवहार को बदल रहे हैं। –

1

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

अपनी स्थिति का सवाल है, शायद रिहाई निर्देशिका में मध्यवर्ती निर्माण फ़ाइलें बाहर समाशोधन या समाधान निर्देशिका में पाया मदद कर सकता है .suo फ़ाइल निकालने के द्वारा।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

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