一、背景說明
昨天在看操作日志報表,發現周末只有一兩條數據,顯得不正常。但一是周末操作本來也不多,二是還有其他事情要做,就沒管了。
但周二再看周一還是沒數據,同事向上排查發現是上游表就沒數據。開始還比較淡定,猜測和之前一樣是因為代碼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