使用gdb 7支持调试Python程序需要什么? [英] What is needed to use gdb 7's support for debugging Python programs?

查看:1059
本文介绍了使用gdb 7支持调试Python程序需要什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用gdb 7的支持来调试Python次要进程。

I'd like to use gdb 7's support for debugging Python "inferior processes".

我需要什么能够做到这一点?

What do I need to be able to do that?

例如:


  • 劣质Python的配置脚本需要有什么标志已经运行?

  • What flags does the inferior Python's configure script need to have been run with?

劣质Python进程必须是Python 2.7或更新版本(我看到当gdb支持Python的那部分是Python源树被承诺)?或者是只有gdb进程本身需要的Python 2.7?

Does the inferior Python process have to be Python 2.7 or newer (I see that's when the part of the gdb support for this that's in Python source tree was committed)? Or is Python 2.7 only needed by the gdb process itself?

什么文件需要安装,例如,在packages.ubuntu.com上我没有得到任何命中python-gdb.py,我相信是需要的。

What files need to have been installed that might not be packaged by all distributions? For example, on packages.ubuntu.com I don't get any hits for python-gdb.py, which I believe is needed.

这将是非常方便,知道什么需要在特定的发行版。我对Ubuntu和Centos需要的特别感兴趣。

It would be very handy to know what's needed on particular distributions. I am particularly interested in what's needed for Ubuntu and Centos.

推荐答案

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 seems to need to have been compiled with --with-pydebug (on Ubuntu 12.04, package python-dbg contains a suitable Python executable, itself called python-dbg). The inferior Python does not need to be Python 2.7 -- 2.6 loads the 2.7 gdb extensions successfully (see the debugging session below). At least on Ubuntu 12.04, the file that gets installed that defines the gdb extensions is called libpython.py, not python-gdb.py (for some reason, building Python yields a build directory containing both those files -- they are identical).

但是,我不认为可能使用生产核心文件进行调试:看起来像Python下层进程的gdb扩展试图获取在生产二进制文件中得到优化的变量(例如, PyEval_EvalFrameEx )。看起来Linux / gdb,Python尚未达到在Illumos上为JavaScript实现的惊人程度,Bryan Cantrill在这里报告的是能够以这种方式调试生产核心转储:

However, I don't think it's currently possible to debug using production core files: it looks like the gdb extensions for Python inferior processes try to get hold of variables that get optimized away in a production binary (for example, the f variable in PyEval_EvalFrameEx). It seems Linux / gdb, and Python has yet to reach the level of awesomeness achieved for JavaScript on Illumos which Bryan Cantrill reports here is able to debug production core dumps in this way:

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

这里是Ubuntu 12.04上的调试会话,显示gdb运行Python 2.6下级进程调试segfault,使用Python 2.7的gdb扩展。首先是导致segfault的代码:

Here's the debug session on Ubuntu 12.04 showing gdb running a Python 2.6 inferior process to debug a segfault, using Python 2.7's gdb extensions. First the code to cause the 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) 

这篇关于使用gdb 7支持调试Python程序需要什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆