2009-03-06 39 views
12

में रिलीज में जोर देने के लिए कैसे करें मुझे केवल जहाज निर्माण चलाने की आवश्यकता है और मुझे समस्या को ठीक करने के लिए रिलीज बिल्ड में कुछ शर्त पर जोर देने की आवश्यकता है। मैं यह कैसे करुं?सी/सी ++

+0

क्या मंच? विंडोज और विजुअल स्टूडियो? –

+0

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

उत्तर

14

NDEBUG मैक्रो undefine - आप इस स्थानीय स्तर पर कर सकते हैं का दावा है आप के आसपास निर्माण में रहना चाहते हैं:

#undef NDEBUG 
#include <assert.h> // reinclude the header to update the definition of assert() 

या जो भी आप ऐसा करने के लिए अपने निर्माण प्रक्रिया में NDEBUG मैक्रो को परिभाषित नहीं करता की जरूरत है प्रथम स्थान।

+0

यदि assert.h पीएच फ़ाइल में शामिल है, तो यह काम नहीं करेगा। –

+0

मैंने अभी कोशिश की है - यह हमेशा काम नहीं करता है। अगर मैं इसे अपने .cpp में पहली दो पंक्तियों के रूप में रखता हूं तो यह कुछ भी नहीं करता है, यह तब भी काम करता है जब मैं इसे अपने मुख्य() से ऊपर रखता हूं। –

+0

तब ऐसा लगता है कि कुछ एनडीईबीयूजी को फिर से परिभाषित करना होगा और फिर 'assert.h' सहित) (संभवतः कुछ अन्य शीर्षलेख शामिल किए जा रहे हैं)। –

2

एएसएसईआरटी का डिफ़ॉल्ट व्यवहार डीबग कॉन्फ़िगरेशन के तहत प्रोग्राम को निरस्त करना है, लेकिन यह आमतौर पर रिलीज कॉन्फ़िगरेशन के तहत नो-ऑप बन जाता है। मेरा मानना ​​है कि यह प्रीप्रोसेसर एनडीईबीयूजी मैक्रो के अस्तित्व की जांच करके करता है। मैं इस समय काम पर नहीं हूं इसलिए यह जांच नहीं सकता है।

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

सामान्य रूप से, एएसएसईआरटी का उपयोग केवल पूर्व शर्त प्रोग्रामिंग के लिए किया जाना चाहिए और कभी भी शिपिंग सॉफ़्टवेयर में विफलताओं को संभालने के लिए नहीं किया जाना चाहिए। आप विकास के दौरान जल्दी विफल करना चाहते हैं, लेकिन उपयोगकर्ता के सामने शानदार विफल करना चाहते हैं।

16

क्यों न सिर्फ अपने खुद के ज़ोर को परिभाषित:

#define assert(x) MessageBox(...); 
+4

ऊपर मतदान किया क्योंकि यह केवल एकमात्र साइन सुझाव है। हालांकि एक लाइन नंबर डालने की सिफारिश करें और गलत क्या हुआ है इसकी व्याख्या। यद्यपि अगली बात यह भी है कि आप अपनी खुद की दुर्घटना प्रणाली को डिज़ाइन करें ताकि जब कोई जोर दे, तो आप एक मेमोरी डंप करते हैं जो स्वचालित रूप से आपको भेज दिया जाता है। – Chad

+2

मुझे यह पसंद है, लेकिन एक छः साल के अंत में सुझाव देना चाहते हैं - अपने दावे के लिए एक अलग नाम का उपयोग करें जिसे आप रिलीज में डिबग करना चाहते हैं और 'ndbgassert' या इसी तरह के डिबग बिल्डों में मौजूद होना चाहते हैं। इस तरह आप दोनों के बीच चयन कर सकते हैं। –

+0

संदेशबॉक्स पर जोर कैसे दिया जाता है ?? क्या यह पहले स्थिति की जांच नहीं करनी चाहिए? – yairchu

3

बस सीधे assert मैक्रो परिभाषा यह है कि रिलीज मोड में सक्रिय है का हिस्सा कहते हैं।

this great article by Miro Samek में सी ++ में दावे के लिए आप बहुत उपयोगी परिभाषाएं पा सकते हैं। फिर आप अपनी जरूरतों को पूरा करने के लिए उन्हें थोड़ा सा ट्विक कर सकते हैं। उदाहरण के लिए, आप एक और मैक्रो, release_assert बना सकते हैं, जो कि जैसा कि रिलीज़ या डीबग मोड में है, भले ही यह वही है।

1

मुझे इसे किसी std :: runtime_error से व्युत्पन्न कुछ प्रकार के assert_exception को फेंकने के लिए परिभाषित करना पसंद है। फिर इसे कहीं पकड़ो और कुछ उपयोगी करें।

1

दरअसल - यदि आप इसके साथ रह सकते हैं तो मैं डीबग संस्करण शिपिंग के साथ जाऊंगा। यदि आपको रिलीज़ संस्करण के प्रदर्शन की आवश्यकता नहीं है, तो डीबग का उपयोग करें। इसमें कम बग्स हैं (यह एक सकल oversimplification है और यदि आप प्रोग्राम बग से मुक्त है, तो बस रिलीज पर स्विच करने से यह नहीं बदलेगा, लेकिन चीजों के कारण संकलक डीबग मोड में करता है, बग नहीं हो सकता है और/या है कम गंभीर परिणाम)।

शायद आपके कार्यक्रम के केवल महत्वपूर्ण समय को अनुकूलित करना भी संभव है।

यह डीबगिंग को सरल बना सकता है।

+4

ठीक है, विजुअल सी ++ में, आप कानूनी रूप से सी ++ डीबग रनटाइम वितरित नहीं कर सकते हैं, इसलिए यदि आप डीएलएल रनटाइम्स (यानी/एमडी या/एमडीडी स्विच) के साथ संकलित करते हैं तो क्लाइंट को डीबग बाइनरी वितरित करना एक समस्या हो सकती है। – paercebal

+1

भले ही यह उत्तर कम हो गया है, मेरा मानना ​​है कि यह एक महत्वपूर्ण बिंदु पर हिट करता है, जो धारणा है कि डेवलपर मुख्य रूप से [डीबग संस्करण] और जो जारी किया जाता है, के बीच चर के समूह को बदलना, एक अच्छा विचार नहीं है । अनुभवी डेवलपर्स इस तथ्य को प्रमाणित करेंगे कि रिलीज और डीबग संस्करण अक्सर अलग-अलग व्यवहार प्रदर्शित करते हैं। – Cameron

0

विजुअल स्टूडियो का उपयोग करते समय आप रिलीज बिल्ड में सक्रिय आवेषण के लिए एनडीईबीयूजी प्रीकंपेलर परिभाषा को परिभाषित कर सकते हैं।

उदाहरण के लिए आप/यू विकल्प के लिए अपने प्रॉजेक्ट सेटिंग्स में $ (undefesTheNDEBUG) सेट कर सकते हैं और फिर NDEBUG (सेट undefesTheNDEBUG = NDEBUG) के लिए वातावरण चर undefesTheNDEBUG परिभाषित या (MSBuild के साथ इसे पारित/p: undefesTheNDEBUG = NDEBUG)

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