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
这是 Ubuntu 12.04 上的调试会话,显示 gdb 使用 Python 2.7 的 gdb 扩展运行 Python 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()
和调试会话:
~/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)