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)