• 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

  • 相关阅读:
    iOS学习05C语言函数
    iOS学习04C语言数组
    iOS学习03C语言循环结构
    iOS学习02C语言分支结构
    iOS学习01C语言数据类型
    Objective-C学习——中文URL编码和解码
    Objective-c 字面量
    SDWebImage
    mac的svn之cornerstone简易教程
    javascript 和oc交互
  • 原文地址:https://www.cnblogs.com/lsdb/p/13597094.html
Copyright © 2020-2023  润新知