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后能打印出导致退出的地方:

Python Segmentation fault错误定位办法

三、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

Original: https://www.cnblogs.com/lsdb/p/13597094.html
Author: 诸子流
Title: Python Segmentation fault错误定位办法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/9292/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部