用GDBdebuggingPython内存

我们有一个使用OpenSSL的Python绑定的Linux应用程序,我怀疑这是导致随机崩溃。 偶尔,我们看到它与消息崩溃:

Python致命错误:已经跟踪GC对象

这看起来或者是库的编程错误,或者是内存损坏的症状。 给定一个核心文件,是否有任何方法可以知道它所执行的Python源代码的最后一行? 或者如果它在GDB中被连接? 我意识到这可能是所有编译的字节码,但我希望有人在那里可能已经处理了这一点。 目前,它正在跟踪模块处于活动状态,我们希望它会再次发生,但可能会持续很长时间。

Solutions Collecting From Web of "用GDBdebuggingPython内存"

是的,你可以做这样的事情:

(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()") File "<string>", line 1, in <module> File "/var/tmp/foo.py", line 2, in <module> i**2 File "<string>", line 1, in <module> $1 = 0 

也应该可以使用python gdbinit文件中定义的pystack命令,但它不适用于我。 这里讨论,如果你想看看它。

另外,如果你怀疑内存问题,值得注意的是,如果你准备重新编译它,你可以使用valgrind和python。 这个过程在这里描述。

如果你有mac或sun box踢,你可以使用dtrace和dtrace编译的python版本来弄清楚当时的应用程序在做什么。 注意:在10.5 python是用dtrace预编译的,这非常好用。

如果你不能使用,那么你可以导入gc并启用调试,然后你可以把它放到一个日志文件中。

要专门回答关于使用GDB进行调试的问题,您可能需要阅读python wiki上的“ 使用GDB进行调试 ”。

如果您使用CDLL在Python中打包C库,并且这是64位的Linux,那么很可能是您的CDLL包装配置错误。 CDLL默认为所有平台上的int返回类型(在64位系统上应该是long long),只是希望传递正确的参数。在这种情况下,您可能需要验证CDLL包装器。

除了以上所述之外,还可以通过跟踪模块快速实现adhoc示踪器 。