一尘不染

使用GDB进行Python内存调试

linux

我们有一个使用OpenSSL的Python绑定的Linux应用程序,我怀疑它会导致随机崩溃。有时,我们会看到它崩溃并显示以下消息:

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

这似乎是库方面的编程错误,或者是内存损坏的症状。给定一个核心文件,有什么办法知道它执行的最后一行Python源代码?还是如果它附加在GDB中?我意识到这可能是所有已编译的字节码,但是我希望那里有人解决了这个问题。当前,它正在运行,并且跟踪模块处于活动状态,我们希望它会再次发生,但是可能要花很长时间。


阅读 734

收藏
2020-06-07

共1个答案

一尘不染

是的,您可以执行以下操作:

(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

也应该可以使用pystackpython
gdbinit文件中定义的命令,但是它对我不起作用。如果您想对此进行讨论,请在此处进行讨论。

另外,如果您怀疑内存问题,值得注意的是valgrind,如果您准备重新编译它,则可以将其与python一起使用。此处描述该过程

2020-06-07