使用gdb 7支持调试Python程序需要什么?

时间:2013-02-14 22:33:55

标签: python debugging ubuntu gdb centos

我想使用gdb 7支持调试Python“劣质进程”。

我需要做什么?

例如:

  • 下级Python的配置脚本需要运行哪些标志?

  • 劣质Python进程是否必须是Python 2.7或更高版本(我看到gdb支持的部分是在Python源代码树中提交的那个)?或者只是gdb进程本身需要Python 2.7?

  • 需要安装哪些文件可能未被所有发行版打包?例如,在packages.ubuntu.com上,我没有得到python-gdb.py的任何命中,我认为这是必需的。

了解特定发行版需要什么是非常方便的。我对Ubuntu和Centos需要什么特别感兴趣。

2 个答案:

答案 0 :(得分: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

这是Ubuntu 12.04上的调试会话,显示运行Python 2.6劣质进程的gdb,使用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()

和调试会话:

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

答案 1 :(得分:0)

对于Centos 6,您只需要这样做:

yum install gdb python-debuginfo
debuginfo-install python

然后,您可以通过使用gdb附加到它们来调试正在运行的python进程:

gdb python [process id]

连接后,只需输入:

即可
py-bt