zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    spring详解(五)——事物管理
    spring详解(四)——JDBC
    spring详解(三)——AOP
    Spring详解(二)
    Spring详解(一)
    springMVC(九)——restful风格和异常处理
    Linux 文件权限
    如何使用Git从GitHub上下载项目
    Spring(1)
    SpringMvc(4)
  • 原文地址:https://www.cnblogs.com/lsdb/p/13597094.html
Copyright © 2011-2022 走看看