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��用, 那么你也得�到任何输出(除了程�奔溃外)。