使用GDB进行Python内存调试
我们有一个在Linux上运行的应用程序,它使用了OpenSSL的Python绑定,我怀疑这个应用程序会导致随机崩溃。有时候,我们会看到它崩溃,并显示这样的信息:
Python致命错误:GC对象已经被追踪
这看起来可能是库里的编程错误,或者是内存损坏的表现。有没有办法知道在崩溃前,Python执行的最后一行代码是什么?如果有核心文件的话,或者在GDB里调试的时候?我知道这些代码可能都是编译过的字节码,但我希望能找到有经验的人来解决这个问题。目前我们正在使用跟踪模块,希望它能再次崩溃,但这可能需要一段时间。
4 个回答
0
除了以上提到的内容,你还可以通过使用trace模块,快速实现一个临时的跟踪器。
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的内存使用情况,但你需要重新编译一下。具体的步骤可以在这里找到。