2013-02-14 8 views
13

私はPythonの "劣等プロセス"のデバッグにgdb 7のサポートを使いたいと思います。Pythonプログラムのデバッグにgdb 7のサポートを使用するためには何が必要ですか?

これを行うには何が必要ですか?例えば

  • 何のフラグ劣るPythonのconfigureスクリプトを使用して実行されている必要がありますか?

  • 下位のPythonプロセスはPython 2.7以降でなければなりません(これはPythonソースツリーのgdbサポートの部分がコミットされたときです)。または、Python 2.7はgdbプロセス自体でのみ必要ですか?

  • すべてのディストリビューションでパッケージ化されていないファイルがインストールされている必要がありますか?たとえば、packages.ubuntu.comではpython-gdb.pyのヒットは得られませんが、これは必要と思われます。

特定のディストリビューションで何が必要なのかを知ることは非常に便利です。私は特にUbuntuとCentosに必要なものに興味があります。

+2

この機能を正しく解釈してもよろしいですか?GDB 7はPythonでGDB自体を拡張するサポートを追加しましたが、私はPythonプログラムをデバッグするのに気付いていません(インタープリタそのものをデバッグする以外には)。それがpdbの目的です。 – FatalError

+0

はい、かなり確かです。厳密には、私の質問は、Pythonプログラム(またはPython自体)をデバッグする機能を提供する* gdbの*機能を使用する* Pythonの機能に関するものです:http://wiki.python.org/moin/DebuggingWithGdb - 例えば、 Pythonスタックを移動するpy-upコマンドとpy-downコマンド、Pythonスタックを印刷するpy-btコマンド、Python名にバインドされた値を出力するpy-printコマンドがあります。 C/Pythonの境界を越える問題に特に役立つと思われますが、コアダンプを使用して、生産時に発生する純粋なPythonの問題をデバッグすることにも興味があります。 –

答えて

19

Pythonは--with-pydebug(Ubuntu 12.04では、パッケージpython-dbgに適切なPython実行ファイルが含まれており、それ自体がpython-dbgと呼ばれています)でコンパイルされている必要があります。下位のPythonはPython 2.7 - 2.6である必要はありません。2.7 gdb拡張を正常にロードします(下記のデバッグセッションを参照)。少なくともUbuntu 12.04では、gdb拡張を定義するファイルがlibpython.pyではなくpython-gdb.pyと呼ばれています(何らかの理由でPythonをビルドすると、両方のファイルを含むビルドディレクトリが得られます)。

しかし、現時点では、本番コアファイルを使用してデバッグすることはできないと考えられます.GDB拡張のPython下位プロセスは、実動バイナリで最適化された変数を保持しようとしますf変数PyEval_EvalFrameEx)。これは、Linux/GDBようで、Pythonはブライアン・キャントリルがここで報告しIllumos上のJavaScriptが達成素晴らしさのレベルが生成コアは、このようにダンプデバッグすることができます達するためには至っていない。

http://www.infoq.com/presentations/Debugging-Production-Systems

ここでは、デバッグ・セッションがありますUbuntu 12.04上で、gdbがPython 2.6の下位プロセスを実行していることを示し、Python 2.7のgdb拡張を使用してsegfaultをデバッグします。まず、セグメンテーション違反を引き起こすコード:

~/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() 

と、デバッグセッション:CentOSに6については

~/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

は、あなたが簡単に実行する必要があります。

yum install gdb python-debuginfo 
debuginfo-install python 

あなたは、その後のpythonを実行しているデバッグすることができますgdbを使用してプロセスに接続するだけです。

gdb python [process id] 

接続したら、次のように入力してください:

py-bt 
関連する問題