16

Python の「劣ったプロセス」をデバッグするための gdb 7 のサポートを使用したいと思います。

そのためには何が必要ですか?

例えば:

  • 下位の Python の構成スクリプトを実行する必要があるフラグは何ですか?

  • 下位の Python プロセスは Python 2.7 以降である必要がありますか (これは、Python ソース ツリーにある gdb サポートの一部がコミットされたときです)。それとも、Python 2.7 は gdb プロセス自体にのみ必要ですか?

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

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

4

2 に答える 2

21

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 をビルドすると、これらの両方のファイルを含むビルド ディレクトリが生成されます。それらは同一です)。

ただし、現在、本番環境のコア ファイルを使用してデバッグすることはできないと思います。Python 下位プロセスの gdb 拡張機能は、本番環境のバイナリで最適化された変数を取得しようとしているようです (たとえば、 の f 変数PyEval_EvalFrameEx) 。 . Linux / gdb のようで、Python は Illumos の JavaScript で達成された素晴らしいレベルにまだ達していません。Bryan Cantrill はここで次のように本番環境のコア ダンプをデバッグできると報告しています。

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

これは、Python 2.7 の gdb 拡張機能を使用して、segfault をデバッグするために Python 2.6 下位プロセスを実行している gdb を示す Ubuntu 12.04 のデバッグ セッションです。最初にセグメンテーション違反を引き起こすコード:

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

およびデバッグ セッション:

~/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) 
于 2013-02-16T00:01:39.313 に答える