त्वरित पृष्ठभूमि: हमारे पास पाइथन में एक बड़ा स्रोत आधार लिखा गया है। यह एक डोमेन विशिष्ट भाषा के लिए एक कंपाइलर है, और आंतरिक रूप से सबकुछ निर्देशित ग्राफ के रूप में दर्शाया जाता है। ये डिग्राफ सेट से बने होते हैं, और इसलिए हम पाइथन में बिल्टिन सेट प्रकार का उपयोग करते हैं।मैं कुछ पायथन कोड में हेज़ेनबग को कैसे ट्रैक करूं?
समस्या यह है कि हमें मूल रूप से एहसास नहीं हुआ कि पायथन सक्रिय रूप से एक सेट ऑब्जेक्ट में ऑर्डर गारंटी की कमी का उपयोग करता है ताकि तेजी से गैर-निर्धारिती कार्यान्वयन का उपयोग किया जा सके। तो जब आप किसी सेट में ऑब्जेक्ट्स पर फिर से सक्रिय होते हैं (जैसा कि हम अक्सर करते हैं) क्रम में लौटाया गया आदेश कमजोर यादृच्छिक है। यह हर निष्पादन पर नहीं बदलता है, लेकिन यह अक्सर बदलता है। मैंने जो कोड देखा है, उससे ऐसा लगता है कि स्रोत कोड का हैश यादृच्छिक संख्या जेनरेटर के लिए बीज के रूप में कार्य करता है। इसलिए कोड को बदलना, जिस पथ को निष्पादित नहीं किया गया है, सेट इटरेटर को उस क्रम को बदलने का कारण बनता है जिसमें तत्व उत्पन्न होते हैं।
हमारी मूल डिबगिंग रणनीति प्रिंटों को डंप करना है जहां हमें लगता है कि त्रुटि है, उन्हें परिष्कृत करना आउटपुट के आधार पर जब तक हम बग नहीं पाते हैं। बहुत सुरुचिपूर्ण नहीं है लेकिन ज्यादातर चीजों के लिए यह काफी हद तक काम करता है। मूलभूत समस्या यह है कि किसी भी प्रिंट स्टेटमेंट को जोड़ना/बदलना अलग-अलग व्यवहार और जंगली रूप से अलग निष्पादन पथ को ट्रिगर करता है। हम सबकुछ प्रिंट/लॉग इन नहीं कर सकते क्योंकि यह कंपाइलर के निष्पादन समय को लगभग 20 (मैनेजबल) से लगभग एक घंटे तक धीमा कर देता है (इतना मज़ेदार नहीं)।
आप किसी ऐसी समस्या का निदान कैसे करेंगे जो केवल बार-बार होता है और जब आप इसे देखना शुरू करते हैं तो गायब हो जाता है? स्पष्टीकरण के लिए
संपादित करें: कई जवाब सेट के आदेश को ठीक करने के तरीके सुझाने। जैसा कि टॉर्किल्डर नीचे बताता है "यहां समस्या यह नहीं है कि सेट अजीब तरीके से व्यवहार करते हैं, समस्या यह है कि आपका प्रोग्राम व्यवहार करता है जैसे कि यह नहीं करता"। यह वास्तव में समस्या है, लेकिन समाधान निर्धारिक सेट का उपयोग नहीं है। यह केवल व्यवहार मुखौटा होगा। समस्या क्यों हमारे प्रोग्राम इस तरीके से व्यवहार करती है और उस व्यवहार को ठीक करें। हमारे द्वारा उपयोग किए जाने वाले एल्गोरिदम को अनियंत्रित सेट के रूप में प्रदर्शित ग्राफ पर काम करना चाहिए। वे नहीं करते मुझे यह पता लगाने की ज़रूरत है कि ये बग कहां और क्यों होते हैं।
समस्या हल: ऐसा लगता है कि अजगर के कार्यान्वयन है कि मैं उपयोग कर रहा हूँ (2.6 ओएस एक्स पर) यदि वस्तुओं की __eq__
और __hash__
तरीकों के बीच संबंध सेट में संग्रहीत किया जा रहा पर नहीं है काफी वैध क्रम तो सिस्टम वर्णित कमजोर यादृच्छिक व्यवहार प्रदर्शित करता है। Set.add() के सी कार्यान्वयन में कुछ कोड होना चाहिए जो प्रतिनिधित्व बनाने के लिए यादृच्छिक मॉड्यूल से कुछ उपयोग करता है। यह सिस्टम एन्ट्रॉपी पूल पर निर्भरता का कारण बनता है जो डिस्क लिखने पर ऑर्डरिंग को बदलता है।
कोई सीधा जवाब नहीं है, लेकिन क्रिस के अनुवर्ती प्रश्न को पढ़ने से इस समस्या को हल करने की अंतर्दृष्टि हुई है, इसलिए उसे वोट मिल गया।
मैंने पीडीबी दस्तावेज़ों पर एक त्वरित नज़र डाली है और मुझे नहीं पता कि यह कैसे करें। दस्तावेज़ों का अर्थ है कि आप पीडीबी को कॉल करके ब्रेकपॉइंट डालने के लिए कोड को बदलते हैं .... क्या मैंने गलत पढ़ा है, या समझा नहीं है? – Amoss
आपने ठीक पढ़ा है, लेकिन ऐसा लगता है कि आपको अपने मामले में पीडीबी को किसी अन्य मॉड्यूल (या यहां तक कि पायथन इंटरैक्टिव से) भी कॉल करना होगा, फिर अपने मॉड्यूल को आयात और चलाएं। अस्पष्ट बात यह है कि यदि सेट व्यवहार स्रोत कोड या स्मृति स्थिति पर निर्भर करता है। वैसे भी आप सेट के बजाय उपन्यासों का भी उपयोग कर सकते हैं। उनके लिए आदेश की यादृच्छिक गैर यादृच्छिक है (और मुझे आश्चर्य है कि सेट में यादृच्छिक कुछ भी है, लेकिन पाइथन दस्तावेज वास्तव में उस पर कुछ नहीं कहता है और यह गारंटी नहीं देता है कि आदेश निरंतर सेट पर लगातार दो पुनरावृत्तियों के लिए स्थिर रहेगा)। – kriss
यदि आपके पास निष्पादन योग्य मॉड्यूल है, तो आप 'python -m pdb mymodule' का उपयोग कर सकते हैं और पीडीबी पहले लोड होगा, जिससे आपको ब्रेकपॉइंट्स इंस्टॉल करने का मौका मिलेगा। अधिकांश लोग कोड बदल देंगे क्योंकि यह आसान है। –