2010-02-12 5 views
12

क्या कोई मानकीकृत (उदाहरण के लिए सभी प्रमुख कंपाइलर्स द्वारा कार्यान्वित किया गया है) # परिभाषित करें जो मुझे डीबग और रिलीज बिल्ड के बीच अंतर करने की अनुमति देगा?सी/सी ++: डीबग/रिलीज का पता लगाने के लिए पोर्टेबल तरीका?

+1

असल में मैं जिस प्रमुख परियोजना पर काम करता हूं, हम अपनी रिलीज में डिबगिंग करते रहते हैं, लेकिन यह रन-टाइम पर वर्बोजिटी निर्धारित करता है। यह जंगली में बग-शिकार में उपयोगी साबित हुआ है, सक्षम होने पर न्यूनतम (_very_ नोटिस करने के लिए कठिन; कोई उपयोगकर्ता शिकायत नहीं) ओवरहेड। एम्बेडेड वातावरण के बाहर, मैं इस तरह के दृष्टिकोण पर विचार करता हूं। – mctylr

+0

"रिलीज बिल्ड" क्या है? सी ++ मानक इसे परिभाषित नहीं करता है, इसलिए यह पता लगाने के लिए कोई पोर्टेबल तरीका नहीं है कि कुछ रिलीज बिल्ड है या नहीं। – jalf

उत्तर

13

अगर विश्वास है

#ifdef NDEBUG 
    // nondebug 
#else 
    // debug code 
#endif 

सबसे पोर्टेबल है।

लेकिन कोई कंपाइलर जानता है कि आप डीबग या रिलीज संकलित कर रहे हैं, तो यह स्वचालित नहीं है। लेकिन सी-रनटाइम में assert.h द्वारा इसका उपयोग किया जाता है, इसलिए यह काफी आम है। विजुअल स्टूडियो इसे सेट करेगा, और मुझे यकीन है कि अधिकांश अन्य आईडीई की इच्छा भी होगी।

+0

मोर्चे पर _ की कमी से संकेत मिलता है कि इसका शायद सी या सी ++ मानकों में कहीं उल्लेख किया गया है। एमएस पिछले रिलीज में किसी भी गैर मानक मैक्रो या उनके सी-रनटाइम हेडर फ़ाइलों में फ़ंक्शन को '_ के –

+5

' के साथ उपसर्ग करने के लिए बहुत ही सावधान रहा है, यह वही नहीं है। एनडीईबीयूजी को परिभाषित करना मैक्रोज़ को बंद कर देता है। और कुछ नहीं। यह __NOT__ डीबग का मतलब है। –

+3

@ मार्टिन: वास्तव में nondebug। और अगर यह इरादा मैक्रोज़ को _only_ बंद करने का इरादा था, तो वे इसे नोएसर कहते थे। अंक लेने से पहले आपको वास्तव में जो लिखा था उसे पढ़ना चाहिए। –

0

संपादित करें: मैंने प्रश्न को गलत तरीके से पढ़ा और एक अलग स्पर्शरेखा पर बंद कर दिया !!! क्षमा याचना ... मैक्रो _NDEBUG लिनक्स पर साथ ही विंडोज पर के रूप में प्रयोग किया जाता है ...

द्विआधारी बनाया गया है और आप आप एक हेक्साडेसिमल डंप प्राप्त कर सकते हैं निर्धारित करने के लिए करता है, तो निर्माण रिहाई/डिबग था की जरूरत है, अगर आप इसमें प्रतीकों का भार देखते हैं जो डीबगिंग जानकारी होगी ... उदाहरण के लिए, लिनक्स के तहत, strings उपयोगिता का उपयोग करना। SysInternals द्वारा विंडोज के लिए एक संस्करण उपलब्ध है, यहां technet पर उपलब्ध है। द्विआधारी निष्पादनयोग्य के रिलीज संस्करणों विभिन्न प्रतीकों का प्रतिनिधित्व तार नहीं होगा ...

 
strings some_binary 

आशा इस मदद करता है, सादर, टॉम।

+0

जरूरी नहीं है; प्रतीकों के साथ द्विआधारी उत्पादन करना संभव है (यानी कार्यों और स्थिर डेटा के लिए) लेकिन डीबग जानकारी (यानी लाइन नंबर) नहीं। –

+0

उस ने कहा, उस जानकारी को प्रदान करने वाले झंडे आमतौर पर जो भी ऑब्जेक्ट फ़ाइल प्रारूप के शीर्षलेख में संग्रहीत होते हैं। जीएनयू objdump का प्रयास करें (विंडोज़ के लिए एक संस्करण भी है, MinGW के साथ वितरित): objdump -x –

3

चूंकि डीबग या रिलीज की कोई मानक परिभाषा नहीं है, ऐसा करने का कोई तरीका नहीं है। मैं कम से कम चार अलग-अलग चीजों के बारे में सोच सकता हूं जिसका मतलब हो सकता है, और वे सभी स्वतंत्र रूप से बदला जा सकता है। कोड के भीतर से केवल दो का परीक्षण किया जा सकता है।

  1. संकलक अनुकूलन स्तर
  2. डिबगिंग प्रतीकों बाइनरी में शामिल (इन यहां तक ​​कि एक बाद की तारीख में हटाया जा सकता है)
  3. ज़ोर() सक्षम (NDEBUG परिभाषित नहीं)
  4. प्रवेश
बंद कर दिया
संबंधित मुद्दे