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

  

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

这似乎是库的编程错误,或内存损坏的症状。在给定核心文件的情况下,有没有办法知道它执行的最后一行Python源代码?或者如果它附加在GDB中?我意识到它可能都是编译后的字节码,但我希望有人可能已经解决了这个问题。目前它正在运行跟踪模块激活,我们希望它会再次发生,但可能需要很长时间。

有帮助吗?

解决方案

是的,你可以做这件事:

(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中定义的 pystack 命令 gdbinit 文件,但它对我不起作用。如果你想研究它,可以在这里进行讨论。

此外,如果您怀疑内存问题,值得注意的是您可以使用 valgrind 如果您准备重新编译它,请使用python。该过程在此处中进行了描述。

其他提示

如果你有mac或sun box,你可以使用 dtrace 和一个版本的使用dtrace编译的python,以确定应用程序当时正在做什么。注意:10.5中使用dtrace预编译python,这非常好用。

如果您无法使用,那么您可以导入gc 并启用调试,然后将其输出到日志文件中。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top