首页 > Python基础应用 > Python3 CookBook中文版 > 15.21 诊断分段错误

15.21 诊断分段错误

问题

解释器因为某个分段错误、总线错误、访问越界或其他致命错误而突然间奔溃。 你想获得Python堆栈信息,从而找出在发生错误的时候你的程序运行点。

解决方案

faulthandler 模块能被用来帮你解决这个问题。 在你的程序中引入下列代码:

import faulthandler
faulthandler.enable()

另外还可以像下面这样使用 -Xfaulthandler 来运行Python:

bash % python3 -Xfaulthandler program.py

最后,你可以设置 PYTHONFAULTHANDLER 环境变量。 开启faulthandler后,在C扩展中的致命错误会导致一个Python错误堆栈被打印出来。例如:

Fatal Python error: Segmentation fault

Current thread 0x00007fff71106cc0:
  File "example.py", line 6 in foo
  File "example.py", line 10 in bar
  File "example.py", line 14 in spam
  File "example.py", line 19 in <module>
Segmentation fault

尽管这个并不能告诉你C代码中哪里出错了,但是至少能告诉你Python里面哪里有错。

讨论

faulthandler会在Python代码执行出错的时候向你展示跟踪信息。 至少,它会告诉你出错时被调用的最顶级扩展函数是哪个。 在pdb和其他Python调试器的帮助下,你就能追根溯源找到错误所在的位置了。

faulthandler不会告诉你任何C语言中的错误信息。 因此,你需要使用传统的C调试器,比如gdb。 不过,在faulthandler追踪信息可以让你去判断从哪里着手。 还要注意的是在C中某些类型的错误可能不太容易恢复。 例如,如果一个C扩展丢弃了程序堆栈信息,它会让faulthandler不可用, 那么你也得不到任何输出(除了程序奔溃外)。

本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
© 2023 PV138 · 站点地图 · 免责声明 · 联系我们 · 问题反馈