पायथन --with-pydebug
साथ संकलित किया गया है की जरूरत है लगता है (Ubuntu 12.04 पर, पैकेज python-dbg
एक उपयुक्त पायथन निष्पादन होता है, जो अपने आप python-dbg
भी कहते हैं)। निम्न पायथन को पायथन 2.7 - 2.6 को 2.7 जीडीबी एक्सटेंशन सफलतापूर्वक लोड करने की आवश्यकता नहीं है (नीचे डिबगिंग सत्र देखें)। कम से कम उबंटू 12.04 पर, जो फ़ाइल स्थापित हो जाती है जो जीडीबी एक्सटेंशन को परिभाषित करती है उसे libpython.py
कहा जाता है, python-gdb.py
नहीं (किसी कारण से, पाइथन बिल्डिंग दोनों फाइलों वाली एक बिल्ड निर्देशिका उत्पन्न करता है - वे समान हैं)।
हालांकि, मुझे नहीं लगता कि वर्तमान में उत्पादन कोर फ़ाइलों का उपयोग करके डीबग करना संभव है: ऐसा लगता है कि पाइथन अवरुद्ध प्रक्रियाओं के लिए जीडीबी एक्सटेंशन जैसे वैरिएबल को पकड़ने का प्रयास करें जो उत्पादन बाइनरी में ऑप्टिमाइज़ हो जाते हैं (उदाहरण के लिए, 0 परिवर्तनीय PyEval_EvalFrameEx
)। यह लिनक्स/gdb लगता है, और अजगर अभी तक पहुँचने के लिए इस तरह से उदासीनता जावास्क्रिप्ट Illumos पर के लिए हासिल की बेहतरीन सुविधाएं जो ब्रायन कैंटरिल यहाँ रिपोर्ट के स्तर डिबग उत्पादन कोर करने में सक्षम है है:
http://www.infoq.com/presentations/Debugging-Production-Systems
यहाँ डिबग सत्र है उबंटू 12.04 पर पाइथन 2.7 के जीडीबी एक्सटेंशन का उपयोग करते हुए, एक सेगफॉल्ट डीबग करने के लिए एक पायथन 2.6 अवरुद्ध प्रक्रिया चलाते हुए जीडीबी दिखा रहा है।
~/Downloads/Python-2.6.4$ cat ~/bin/dumpcore.py
class Foo:
def bar(self):
from ctypes import string_at
string_at(0xDEADBEEF) # this code will cause Python to segfault
def main():
f = Foo()
f.someattr = 42
f.someotherattr = {'one':1, 'two':2L, 'three':[(), (None,), (None, None)]}
f.bar()
if __name__ == "__main__":
main()
और डिबगिंग सत्र:
yum install gdb python-debuginfo
debuginfo-install python
फिर आप डिबग चल अजगर कर सकते हैं:
~/Downloads/Python-2.6.4$ gdb --args ./python ~/bin/dumpcore.py
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/john/Downloads/Python-2.6.4/python...done.
(gdb) run
Starting program: /home/john/Downloads/Python-2.6.4/python /home/john/bin/dumpcore.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000000468d67 in PyString_FromString (str=0xdeadbeef <Address 0xdeadbeef out of bounds>) at Objects/stringobject.c:116
116 size = strlen(str);
(gdb) py-bt
Undefined command: "py-bt". Try "help".
(gdb) python
>import sys
>sys.path.insert(0, "/home/john/Downloads/Python-2.7/Tools/gdb")
>import libpython
>(gdb) py-bt
#10 Frame 0x8f0f90, for file /home/john/Downloads/Python-2.6.4/Lib/ctypes/__init__.py, line 496, in string_at (ptr=3735928559, size=-1)
return _string_at(ptr, size)
#14 Frame 0x8ebf90, for file /home/john/bin/dumpcore.py, line 5, in bar (self=<Foo(someattr=42, someotherattr={'three': [(), (None,), (None, None)], 'two': 2L, 'one': 1}) at remote 0x7ffff6e03240>, string_at=<function at remote 0x7ffff6e1c990>)
string_at(0xDEADBEEF) # this code will cause Python to segfault
#17 Frame 0x8ebd80, for file /home/john/bin/dumpcore.py, line 12, in main (f=<Foo(someattr=42, someotherattr={'three': [(), (None,), (None, None)], 'two': 2L, 'one': 1}) at remote 0x7ffff6e03240>)
f.bar()
#20 Frame 0x8eb680, for file /home/john/bin/dumpcore.py, line 16, in <module>()
main()
(gdb)
क्या आप वाकई इस सुविधा को सही तरीके से व्याख्या कर रहे हैं?जीडीबी 7 ने पीडीथन में जीडीबी को विस्तारित करने के लिए समर्थन जोड़ा, लेकिन मुझे एक पायथन प्रोग्राम डीबग करने के लिए इसका उपयोग करने में सक्षम होने के बारे में पता नहीं है (दुभाषिया को स्वयं डिबग करने के बाहर)। मैंने सोचा कि पीडीबी क्या है, मैंने सोचा। – FatalError
हाँ, बिल्कुल यकीन है। कड़ाई से, मेरा सवाल पाइथन सुविधा के बारे में है जो * पाइथन प्रोग्राम (या पायथन स्वयं) डिबग करने के लिए सुविधाओं को प्रदान करने के लिए जीडीबी में सुविधा का उपयोग करता है: http://wiki.python.org/moin/DebuggingWithGdb - उदा। पाइथन स्टैक के माध्यम से स्थानांतरित करने के लिए पाइ-अप और पाय-डाउन कमांड हैं, पाइथन स्टैक को मुद्रित करने के लिए एक पीई-बीटी कमांड, और पाइथन नाम से जुड़े मूल्य को मुद्रित करने के लिए एक पीई-प्रिंट कमांड है। सी/पायथन सीमा पार करने वाली समस्याओं के लिए विशेष रूप से उपयोगी लगता है, लेकिन मैं कोर डंप का उपयोग करके उत्पादन में होने वाले शुद्ध पायथन मुद्दों को डीबग करने के लिए भी कोशिश कर रहा हूं। –