2013-02-14 10 views
13

मैं पाइथन "अवरुद्ध प्रक्रियाओं" को डीबग करने के लिए जीडीबी 7 के समर्थन का उपयोग करना चाहता हूं।पायथन प्रोग्राम डीबग करने के लिए जीडीबी 7 के समर्थन का उपयोग करने के लिए क्या आवश्यक है?

मुझे ऐसा करने में सक्षम होने की क्या ज़रूरत है?

उदाहरण के लिए:

  • क्या झंडे अवर पायथन के कॉन्फ़िगर स्क्रिप्ट के साथ चलाने के लिए की जरूरत है किया गया है?

  • क्या निम्न पाइथन प्रक्रिया को पायथन 2.7 या नया होना चाहिए (मुझे लगता है कि जब पाइथन स्रोत पेड़ में इसके लिए जीडीबी समर्थन का हिस्सा किया गया था)? या पाइथन 2.7 केवल जीडीबी प्रक्रिया द्वारा ही आवश्यक है?

  • कौन सी फाइलों को स्थापित करने की आवश्यकता है जो सभी वितरणों द्वारा पैक नहीं किया जा सकता है? उदाहरण के लिए, packages.ubuntu.com पर मुझे Python-gdb.py के लिए कोई हिट नहीं मिलती है, जो मुझे विश्वास है कि इसकी आवश्यकता है।

यह जानना बहुत आसान होगा कि विशेष वितरण पर क्या आवश्यक है। मुझे विशेष रूप से दिलचस्पी है कि उबंटू और सेंटोस के लिए क्या आवश्यक है।

+2

क्या आप वाकई इस सुविधा को सही तरीके से व्याख्या कर रहे हैं?जीडीबी 7 ने पीडीथन में जीडीबी को विस्तारित करने के लिए समर्थन जोड़ा, लेकिन मुझे एक पायथन प्रोग्राम डीबग करने के लिए इसका उपयोग करने में सक्षम होने के बारे में पता नहीं है (दुभाषिया को स्वयं डिबग करने के बाहर)। मैंने सोचा कि पीडीबी क्या है, मैंने सोचा। – FatalError

+0

हाँ, बिल्कुल यकीन है। कड़ाई से, मेरा सवाल पाइथन सुविधा के बारे में है जो * पाइथन प्रोग्राम (या पायथन स्वयं) डिबग करने के लिए सुविधाओं को प्रदान करने के लिए जीडीबी में सुविधा का उपयोग करता है: http://wiki.python.org/moin/DebuggingWithGdb - उदा। पाइथन स्टैक के माध्यम से स्थानांतरित करने के लिए पाइ-अप और पाय-डाउन कमांड हैं, पाइथन स्टैक को मुद्रित करने के लिए एक पीई-बीटी कमांड, और पाइथन नाम से जुड़े मूल्य को मुद्रित करने के लिए एक पीई-प्रिंट कमांड है। सी/पायथन सीमा पार करने वाली समस्याओं के लिए विशेष रूप से उपयोगी लगता है, लेकिन मैं कोर डंप का उपयोग करके उत्पादन में होने वाले शुद्ध पायथन मुद्दों को डीबग करने के लिए भी कोशिश कर रहा हूं। –

उत्तर

19

पायथन --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) 
0

Centos 6 के लिए, आप बस क्या करने की जरूरत पहले कोड segfault पैदा करने के लिए जीडीबी के साथ बस उन्हें संलग्न करके प्रक्रिया:

gdb python [process id] 

एक बार कनेक्ट होने पर, बस टाइप करें:

py-bt 
संबंधित मुद्दे

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