2014-04-29 5 views
6

हमें यह पता लगाना होगा कि हमारा कोड एक सीपीथन निष्पादन योग्य के तहत चल रहा है, जिसे प्रोग्रामिंग के साथ डिबगिंग सक्षम बनाया गया है। sys मॉड्यूल में उबंटू 14.04 के कम से कम python3.4-dbg पर कोई जानकारी नहीं प्रतीत होती। sys.flags.debug 0 पर सेट है। इसका कारण यह है कि हमारा कोड असम्बद्ध वास्तव में पायथन के डीबग संस्करणों को क्रैश करता है। अद्यतन: विशेष रूप से कोड सी पक्ष पर एक दावा त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है।पाइथन में क्या सीपीथन निष्पादन योग्य डीबग संस्करण है, यह जानने के लिए कैसे?

निश्चित रूप से 'd' in sys.executable देखने से बेहतर होना चाहिए। python3.4-dbg का उपयोग कर

>>> import sysconfig 
>>> sysconfig.get_config_var('Py_DEBUG') 
0 

दूसरी ओर:

उत्तर

9

निम्नलिखित कोड हो सकता है कि आप क्या कर रहे हैं के बाद

python3.4 का उपयोग

>>> import sysconfig 
>>> sysconfig.get_config_var('Py_DEBUG') 
1 

हालांकि, वहाँ भी कर रहे हैं संकलन "डीबग" व्यवहार को नियंत्रित करने वाले समय विकल्प, जैसे कि NDEBUG menti यहां पर: http://bugs.python.org/issue17411

दूसरे शब्दों में: हालांकि Py_DEBUG अनसेट (0) हो सकता है, NDEBUG द्वारा नियंत्रित सी-कोड आवेदक अभी भी पाइथन के व्यवहार को बदल सकते हैं। Py_DEBUG सेट करना हमेशा NDEBUG को अनसेट करता है जिसके परिणामस्वरूप आवेषण लागू होते हैं। Py_DEBUG की कमी NDEBUG पर कोई प्रभाव नहीं पड़ता - यह परिभाषित या परिभाषित नहीं किया जा सकता है। यदि NDEBUG परिभाषित किया गया है, तो आवेषण को शून्य मैक्रो के रूप में परिभाषित किया जाएगा।

http://en.wikipedia.org/wiki/Assert.h से

:

प्रोग्रामर्स सिर्फ कार्यक्रम फिर कंपाइल, स्रोत कोड को बदले बिना द्वारा दावे को खत्म कर सकते हैं: यदि मैक्रो NDEBUG की, ज़ोर शामिल किए जाने से पहले परिभाषित किया गया है() मैक्रो है परिभाषित बस के रूप में:

#define assert(ignore)((void) 0) 

एक संभव है, लेकिन unportable, समाधान संकलक कमांड लाइन 0,123,827 जांच करने के लिए किया जाएगा इस के लिए:

>>> '-DNDEBUG' not in (sysconfig.get_config_var('OPT') or '') 

जहां OPT उदाहरण

>>> sysconfig.get_config_var('OPT') 
'-DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes' 
+0

वाह के लिए हो सकता है, कि पता नहीं था। +1 – vaultah

+1

यह उन कारणों में से एक है जिनसे मैं सी asserts से नफरत करता हूं - किसी को पता था कि चीजें गलत हो सकती हैं लेकिन इसे संभालने के बजाय इसे परीक्षण करने का विकल्प चुना गया है ** डीबग में केवल ** बनाता है और चीजें वितरित करने योग्य में नरक में जा सकती हैं कोड - * (रेंट ओवर, स्पलीन वेंटेड)! * –

+0

अयोग्य हां, लेकिन कम से कम यह वास्तविक ऑपरेटिंग सिस्टम पर काम करता है, मुझे sysconfig या उनके अर्थों में Py_DEBUG और NDEBUG के बारे में पता नहीं था, धन्यवाद। –

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