Python Segmentation fault错误定位办法

一、背景说明

昨天在看操作日志报表,发现周末只有一两条数据,显得不正常。但一是周末操作本来也不多,二是还有其他事情要做,就没管了。

但周二再看周一还是没数据,同事向上排查发现是上游表就没数据。开始还比较淡定,猜测和之前一样是因为代码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

https://pypi.org/project/faulthandler/

https://docs.python.org/3/library/faulthandler.html

posted on 2020-09-01 19:39  诸子流  阅读(18944)  评论(0编辑  收藏  举报