一、背景说明
昨天在看操作日志报表,发现周末只有一两条数据,显得不正常。但一是周末操作本来也不多,二是还有其他事情要做,就没管了。
但周二再看周一还是没数据,同事向上排查发现是上游表就没数据。开始还比较淡定,猜测和之前一样是因为代码catch到异常就直接exit把exit去掉再把这两天的数据补回来就完事了。但去掉之后重新跑,数据表还是迟迟没数据,感觉把问题想简单了。
进一步分析,徒手运行代码“Segmentation fault (core dumped)”,尝试try-except但是并不能捕获到异常。google看是说Segmentation错误一般是底层C语言库的错误,try-except没用但可以用faulthandler把错误位置打印出来。
二、python3使用faulthandler
2.1 使用方式
faulthandler在python3.3之后成为标准库,可以通过import到代码中启用,也可以直接通过命令行来启用。
通过import到代码中来启用:
import faulthandler # 在import之后直接添加以下启用代码即可 faulthandler.enable() # 后边正常写你的代码
直接通过命令行来启用,运行时添加-X faulthandler参数即可:
python3 -X faulthandler my_script.py
2.2 使用效果演示
代码示例(建议在linux上运行该代码):
import traceback def test_segmentation_fault(): # 对于segmentation fault并不能catch到异常,即此处try没效果 try: ctypes.string_at(0) except Exception as e: print(traceback.format_exc()) if __name__ == "__main__": test_segmentation_fault()
如下图所示,在未使用faulthandler时try不生效完全不知道哪里出了问题,在使用faulthandler后能打印出导致退出的地方:
三、python2使用faulthandler
faulthandler在python2中不是标准库,需要另行安装。(另外随着faulthandler在python3中成为标准库及python2不再维护,作者也不再更新faulthandler)
pip install faulthandler
由于python2也不支持-X参数,所以faulthandler在python2中只能通过import到代码中来启用
import faulthandler # 在import之后直接添加以下启用代码即可 faulthandler.enable() # 后边正常写你的代码
参考:
https://python3-cookbook.readthedocs.io/zh_CN/latest/c15/p21_diagnosing_segmentation_faults.html