使用GDB进行Python内存调试

5 投票
4 回答
4948 浏览
提问于 2025-04-11 17:58

我们有一个在Linux上运行的应用程序,它使用了OpenSSL的Python绑定,我怀疑这个应用程序会导致随机崩溃。有时候,我们会看到它崩溃,并显示这样的信息:

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

这看起来可能是库里的编程错误,或者是内存损坏的表现。有没有办法知道在崩溃前,Python执行的最后一行代码是什么?如果有核心文件的话,或者在GDB里调试的时候?我知道这些代码可能都是编译过的字节码,但我希望能找到有经验的人来解决这个问题。目前我们正在使用跟踪模块,希望它能再次崩溃,但这可能需要一段时间。

4 个回答

0

除了以上提到的内容,你还可以通过使用trace模块,快速实现一个临时的跟踪器。

1

如果你手头有Mac电脑或者Sun的设备,可以使用dtrace,还有一个用dtrace编译过的Python版本,来查看应用程序在某个时刻在做什么。注意:在10.5版本中,Python已经预先编译了dtrace,这样使用起来就非常方便。

如果你没有这些设备,那你可以导入gc模块并开启调试,这样你就可以把调试信息输出到日志文件里。

关于使用GDB进行调试的问题,你可以看看Python维基上的“使用GDB调试”这篇文章。

5

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

(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的内存使用情况,但你需要重新编译一下。具体的步骤可以在这里找到。

撰写回答