2010-09-28 51 views
7

त्वरित पृष्ठभूमि: हमारे पास पाइथन में एक बड़ा स्रोत आधार लिखा गया है। यह एक डोमेन विशिष्ट भाषा के लिए एक कंपाइलर है, और आंतरिक रूप से सबकुछ निर्देशित ग्राफ के रूप में दर्शाया जाता है। ये डिग्राफ सेट से बने होते हैं, और इसलिए हम पाइथन में बिल्टिन सेट प्रकार का उपयोग करते हैं।मैं कुछ पायथन कोड में हेज़ेनबग को कैसे ट्रैक करूं?

समस्या यह है कि हमें मूल रूप से एहसास नहीं हुआ कि पायथन सक्रिय रूप से एक सेट ऑब्जेक्ट में ऑर्डर गारंटी की कमी का उपयोग करता है ताकि तेजी से गैर-निर्धारिती कार्यान्वयन का उपयोग किया जा सके। तो जब आप किसी सेट में ऑब्जेक्ट्स पर फिर से सक्रिय होते हैं (जैसा कि हम अक्सर करते हैं) क्रम में लौटाया गया आदेश कमजोर यादृच्छिक है। यह हर निष्पादन पर नहीं बदलता है, लेकिन यह अक्सर बदलता है। मैंने जो कोड देखा है, उससे ऐसा लगता है कि स्रोत कोड का हैश यादृच्छिक संख्या जेनरेटर के लिए बीज के रूप में कार्य करता है। इसलिए कोड को बदलना, जिस पथ को निष्पादित नहीं किया गया है, सेट इटरेटर को उस क्रम को बदलने का कारण बनता है जिसमें तत्व उत्पन्न होते हैं।

हमारी मूल डिबगिंग रणनीति प्रिंटों को डंप करना है जहां हमें लगता है कि त्रुटि है, उन्हें परिष्कृत करना आउटपुट के आधार पर जब तक हम बग नहीं पाते हैं। बहुत सुरुचिपूर्ण नहीं है लेकिन ज्यादातर चीजों के लिए यह काफी हद तक काम करता है। मूलभूत समस्या यह है कि किसी भी प्रिंट स्टेटमेंट को जोड़ना/बदलना अलग-अलग व्यवहार और जंगली रूप से अलग निष्पादन पथ को ट्रिगर करता है। हम सबकुछ प्रिंट/लॉग इन नहीं कर सकते क्योंकि यह कंपाइलर के निष्पादन समय को लगभग 20 (मैनेजबल) से लगभग एक घंटे तक धीमा कर देता है (इतना मज़ेदार नहीं)।

आप किसी ऐसी समस्या का निदान कैसे करेंगे जो केवल बार-बार होता है और जब आप इसे देखना शुरू करते हैं तो गायब हो जाता है? स्पष्टीकरण के लिए

संपादित करें: कई जवाब सेट के आदेश को ठीक करने के तरीके सुझाने। जैसा कि टॉर्किल्डर नीचे बताता है "यहां समस्या यह नहीं है कि सेट अजीब तरीके से व्यवहार करते हैं, समस्या यह है कि आपका प्रोग्राम व्यवहार करता है जैसे कि यह नहीं करता"। यह वास्तव में समस्या है, लेकिन समाधान निर्धारिक सेट का उपयोग नहीं है। यह केवल व्यवहार मुखौटा होगा। समस्या क्यों हमारे प्रोग्राम इस तरीके से व्यवहार करती है और उस व्यवहार को ठीक करें। हमारे द्वारा उपयोग किए जाने वाले एल्गोरिदम को अनियंत्रित सेट के रूप में प्रदर्शित ग्राफ पर काम करना चाहिए। वे नहीं करते मुझे यह पता लगाने की ज़रूरत है कि ये बग कहां और क्यों होते हैं।

समस्या हल: ऐसा लगता है कि अजगर के कार्यान्वयन है कि मैं उपयोग कर रहा हूँ (2.6 ओएस एक्स पर) यदि वस्तुओं की __eq__ और __hash__ तरीकों के बीच संबंध सेट में संग्रहीत किया जा रहा पर नहीं है काफी वैध क्रम तो सिस्टम वर्णित कमजोर यादृच्छिक व्यवहार प्रदर्शित करता है। Set.add() के सी कार्यान्वयन में कुछ कोड होना चाहिए जो प्रतिनिधित्व बनाने के लिए यादृच्छिक मॉड्यूल से कुछ उपयोग करता है। यह सिस्टम एन्ट्रॉपी पूल पर निर्भरता का कारण बनता है जो डिस्क लिखने पर ऑर्डरिंग को बदलता है।

कोई सीधा जवाब नहीं है, लेकिन क्रिस के अनुवर्ती प्रश्न को पढ़ने से इस समस्या को हल करने की अंतर्दृष्टि हुई है, इसलिए उसे वोट मिल गया।

उत्तर

2

क्यों सेट कोड ऑर्डरिंग को प्रभावित करने वाले कोड में कुछ भी नहीं बदलते हैं और प्रिंट जोड़ने के बजाय pdb का उपयोग करते हैं? क्या ब्रेकपॉइंट सेट करना भी सेट ऑर्डरिंग बदलता है? यदि नहीं, तो पीडीबी आपको आंतरिक चर का निरीक्षण करने की अनुमति देगा।

आपकी समस्या का आपका विवरण कुछ रहस्यों को भी जन्म देता है। आप कैसे पता लगाते हैं कि एक बग है? यदि यह पता चलने पर किया जा सकता है तो एक संभावित रणनीति आपके कोड से पीडीबी चलाने के लिए होगी (जितनी जल्दी हो सके import pdb; pdb.set_trace()) जैसे ही आप इसे देखते हैं (रन टाइम आईएफएस का उपयोग करके), कोड बदलने के बाद बाद में निष्पादन में नहीं। इस तरह आपको कोड को डीबग करने के लिए बिल्कुल भी नहीं बदलना पड़ेगा (लेकिन कोड को डीबग किया जाएगा और मजबूत रॉक होने पर बाद में उन दावों को दूर करने के लिए)।

जिस तरह से आपको इसे लिखते समय अपने सभी कोड का परीक्षण करना चाहिए, तो यह सबटाइल बग को छिपाने की संभावना कम होगी।

+0

मैंने पीडीबी दस्तावेज़ों पर एक त्वरित नज़र डाली है और मुझे नहीं पता कि यह कैसे करें। दस्तावेज़ों का अर्थ है कि आप पीडीबी को कॉल करके ब्रेकपॉइंट डालने के लिए कोड को बदलते हैं .... क्या मैंने गलत पढ़ा है, या समझा नहीं है? – Amoss

+0

आपने ठीक पढ़ा है, लेकिन ऐसा लगता है कि आपको अपने मामले में पीडीबी को किसी अन्य मॉड्यूल (या यहां तक ​​कि पायथन इंटरैक्टिव से) भी कॉल करना होगा, फिर अपने मॉड्यूल को आयात और चलाएं। अस्पष्ट बात यह है कि यदि सेट व्यवहार स्रोत कोड या स्मृति स्थिति पर निर्भर करता है। वैसे भी आप सेट के बजाय उपन्यासों का भी उपयोग कर सकते हैं। उनके लिए आदेश की यादृच्छिक गैर यादृच्छिक है (और मुझे आश्चर्य है कि सेट में यादृच्छिक कुछ भी है, लेकिन पाइथन दस्तावेज वास्तव में उस पर कुछ नहीं कहता है और यह गारंटी नहीं देता है कि आदेश निरंतर सेट पर लगातार दो पुनरावृत्तियों के लिए स्थिर रहेगा)। – kriss

+0

यदि आपके पास निष्पादन योग्य मॉड्यूल है, तो आप 'python -m pdb mymodule' का उपयोग कर सकते हैं और पीडीबी पहले लोड होगा, जिससे आपको ब्रेकपॉइंट्स इंस्टॉल करने का मौका मिलेगा। अधिकांश लोग कोड बदल देंगे क्योंकि यह आसान है। –

1

मैं वास्तव में नहीं देखता कि आप समस्या को और क्यों देखना चाहते हैं जब आप स्पष्ट रूप से एक विचार है कि समस्या की जड़ क्या है।

मुख्य मुद्दा यह है: आपको निर्धारिती, आदेशित ग्राफ की आवश्यकता है; पायथन सेट आपको यह नहीं देता है। आप कुछ सूची/सेट कार्यान्वयन में कार्यान्वयन क्यों नहीं बदलेंगे?

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

संपादित करें: इसे समेटने के लिए; यहां समस्या यह नहीं है कि सेट अजीब तरीके से व्यवहार करते हैं, समस्या यह है कि आपका प्रोग्राम व्यवहार करता है जैसे कि यह नहीं करता है।

+0

.. साथ ही, मुझे संदेह है कि आपने इसे पोस्ट किया है, केवल इसलिए कि आप हेइज़ेनबग लिख सकते हैं;) – torkildr

+1

मुझे लगता है कि उनके कोड की तरह * मुझे ऑर्डर पर कोई निर्भरता नहीं होनी चाहिए, लेकिन, एक बग के कारण, करता है । हालांकि समस्या का पता लगाने/हल करने का शायद आपका सुझाव शायद सबसे अच्छा तरीका है। –

+0

क्योंकि हमें सेट करने वाले प्रदर्शन की आवश्यकता होती है, और यदि हम अपने स्वयं के निर्धारक सेट लिखते हैं तो यह होगा) बहुत धीमी हो, और बी) बहुत सारे विकास प्रयास करें। इसके अलावा, जैसा कि डगलस ऊपर बताता है हमें वैसे भी बग को ठीक करने की आवश्यकता है। – Amoss

1

रेमंड हेटिंगर ने a recipe for ordered sets लिखा है। सभी विधियों के लिए इसका बिग-ओ चलने का समय सेट के समान ही है। हो सकता है कि आप अपने सभी सेट ऑर्डर पर बदलना चाहें।

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