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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM