2014-09-22 7 views
29

एक पंक्ति का मूल्यांकन करने के लिए एन को हिट करने के बाद, मैं वापस जाना चाहता हूं और फिर विफल होने पर उस फ़ंक्शन में कदम उठाने के लिए एस दबाता हूं। क्या यह संभव है?पीडीबी में पीछे की ओर कदम करना संभव है?

डॉक्स कहते हैं:

j (UMP) lineno अगली पंक्ति है कि निष्पादित किया जाएगा निर्धारित करें। केवल नीचे-फ्रेम में उपलब्ध है। यह आपको वापस कूदने और कोड को फिर से निष्पादित करने देता है, या उस कोड को छोड़ने के लिए आगे बढ़ता है जिसे आप चलाने के लिए नहीं चाहते हैं।

+4

नहीं। पीडीबी वापस समय नहीं बदल सकता है। –

+0

@MartijnPieters मेरे संपादन को देखते हैं, दस्तावेज़ कहते हैं कि आप एक पंक्ति पर वापस कूद सकते हैं, इसलिए ऐसा करना संभव नहीं है या किसी भी तरह पिछली रेखा पर वापस कूदना संभव नहीं है? – YPCrumble

+0

उस फ़ंक्शन पर वापस कूदना जो विफल रहा और राज्य को बहाल करने से विफल रहा क्योंकि दो अलग-अलग चीजें हैं। –

उत्तर

22

जीएनयू डीबगर, जीडीबी: यह बेहद धीमा है, क्योंकि यह एक समय में एकल मशीन निर्देश को पूर्ववत करता है।

पायथन डीबगर, पीडीबी: jump कमांड आपको कोड में पीछे ले जाता है, लेकिन कार्यक्रम की स्थिति को उलट नहीं देता है।

पायथन के लिए, विस्तारित पायथन डीबगर प्रोटोटाइप, एपीडीबी, इस कारण से बनाया गया था। यहां thesis है और यहां program and the code है।

मैंने अपनी एमएससी डिग्री के हिस्से के रूप में एक लाइव रिवर्स डीबगर बनाने के लिए एक प्रारंभिक बिंदु के रूप में एपीडीबी का उपयोग किया। थीसिस ऑनलाइन उपलब्ध है: Combining reverse debugging and live programming towards visual thinking in computer programming। अध्याय 1 और 2 में मैं डीबगिंग को रिवर्स करने के लिए अधिकांश ऐतिहासिक दृष्टिकोण भी शामिल करता हूं।

+0

थीसिस वास्तव में अच्छा लग रहा है! मैंने इसे विस्तार से नहीं पढ़ा है, लेकिन जैसा कि आप एक विशेषज्ञ हैं: अब तक इस प्रश्न में उल्लिखित समाधानों के बारे में आप क्या सोचते हैं? आपका एपीडीबी बनाम [timetravelpdb] (https://github.com/TomOnTime/timetravelpdb) बनाम [पीपीपी में revdb] (https://morepypy.blogspot.com.au/2016/07/reverse-debugging-for-python। एचटीएमएल)? – ShreevatsaR

+1

@ShreevatsaR यह सुनिश्चित नहीं है कि आप किस सिद्धांत का जिक्र कर रहे हैं, पैट्रिक सबिन के पहले एपीडीबी थीसिस, या बाद में थीसिस, दोनों ऊपर से जुड़े हुए हैं। 2 साल से अधिक के लिए रिवर्स डीबगिंग विकास का पालन नहीं किया है, इसलिए सुनिश्चित नहीं है। त्वरित नज़र के बाद: timetravelpdb एपीडीबी के समान ही लगता है, लेकिन इसमें कम विशेषताएं हैं, उदा। एपीडीबी न केवल कार्यक्रम राज्य बल्कि बाह्य/पर्यावरण राज्य (कुछ डिग्री तक) का प्रबंधन करता है, यह निर्धारित करने के लिए। रेवडब रिकॉर्ड-रीप्ले दृष्टिकोण का उपयोग करता है, यह बाहरी स्थिति का प्रबंधन नहीं करता है। मेरे थीसिस में बताया गया है कि रिकॉर्ड-रीप्ले और स्नैपशॉटिंग (मेरी वरीयता) दोनों दृष्टिकोणों में गुण हैं। – Abraham

+0

धन्यवाद! यह सहायक है। – ShreevatsaR

9

रिवर्स डीबगिंग (पहले दर्ज किए गए एप्लिकेशन स्थिति या पीछे की ओर एकल-चरण डीबगिंग पर लौटना) आमतौर पर एक असेंबली या सी लेवल डीबगर सुविधा होती है। जैसे gdb यह कर सकते हैं:

https://sourceware.org/gdb/wiki/ReverseDebug

Bidirectional (or reverse) debugging

Reverse debugging is utterly complex, and may have performance penalty of 50.000x। इसे डिबगिंग टूल से व्यापक समर्थन की भी आवश्यकता है। पायथन वर्चुअल मशीन रिवर्स डीबगिंग समर्थन प्रदान नहीं करती है।

यदि आप इंटरैक्टिव मूल्यांकन पाइथन कोड हैं तो मैं सुझाव देता हूं कि IPython Notebook जो HTML- आधारित इंटरैक्टिव पायथन शैल प्रदान करता है। आप आसानी से अपना कोड लिख सकते हैं और ऑर्डर कर सकते हैं और ऑर्डर कर सकते हैं। हालांकि, कोई पीडीबी डीबगिंग समर्थन नहीं है। ipdb है जो दर्ज डिबगिंग कमांड के लिए बेहतर इतिहास और खोज सुविधाएं प्रदान करता है, लेकिन जहां तक ​​मुझे पता है, यह प्रत्यक्ष पिछड़ा कूद नहीं करता है।

6

पीईपीई ने RevDB को लागू करना शुरू कर दिया है, जो रिवर्स डीबगिंग का समर्थन करता है।

यह अभी भी अल्फा चरण में (फरवरी 2017 तक) है, केवल पायथन 2.7 का समर्थन करता है, केवल लिनक्स या ओएस एक्स पर काम करता है, और आपको एक विशेष संशोधन से पाइथन बनाने की आवश्यकता होती है। यह भी बहुत धीमी है और बहुत सी रैम का उपयोग करता है। बिटबकेट पेज को उद्धृत करने के लिए:

ध्यान दें कि लॉग फ़ाइल आम तौर पर प्रति सेकंड 1-2 एमबी की दर से बढ़ती है। माना जाता है कि आकार कोई समस्या नहीं है, सीमित कारक हैं:

  • समय को दोहराएं। यदि आपके रिकॉर्ड किए गए निष्पादन में कुछ मिनट से अधिक समय लगे, तो पुनः चलाने से दर्दनाक धीमा हो जाएगा। कभी-कभी एक सत्र में कई बार पूरे लॉग पर जाना पड़ता है। यदि बग यादृच्छिक रूप से होता है लेकिन शायद ही कभी, आपको कुछ मिनटों के लिए रिकॉर्डिंग चलाना चाहिए, फिर प्रक्रिया को मारना चाहिए और फिर से प्रयास करें, जब तक आपको दुर्घटना न हो जाए।
  • रीप्लेइंग के लिए रैम उपयोग। रिकॉर्डिंग के मुकाबले रैम की आवश्यकताएं रीप्लेइंग के लिए 10 या 15 गुना अधिक हैं।यदि यह बहुत अधिक है, तो आप _revdb/process.py में MAX_SUBPROCESSES के लिए कम मान के साथ प्रयास कर सकते हैं, लेकिन यह हमेशा कई गुना बड़ा होगा।

विवरण PyPy blog पर हैं और स्थापना और उपयोग निर्देशों RevDB bitbucket page पर हैं।

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