用c實現跨平臺異常捕獲機制

TBOX封裝了一套跨平臺的異常捕獲實現,來模擬windows的seh異常處理功能,並且是線程安全的。linux

在linux/mac下的實現

  • 使用signal 捕獲異常信號git

  • 使用sigsetjmp保存現場寄存器和信號掩碼,出現異常後使用 siglongjmp 跳轉到異常處理過程,並恢復狀態github

  • 使用線程局部存儲維護 sigjmpbuf 寄存器現場狀態堆棧,保證多線程安全,而且能夠實現多層嵌套捕獲處理。windows

在windows下的實現

這個就不用多說了,在vs下直接用 __try、__except 關鍵字就好了,若是在mingw下編譯, 經過 setjmp實現也很方便。安全

具體使用

注: 因爲使用setjmp 進行寄存器現場保護, 若是使用整型局部變量, 有可能會被編譯器優化到寄存器中。
因此try內部的修改,可能會在異常捕獲後,被會恢復掉。
最好加上volatile來禁止優化。多線程

__tb_volatile__ tb_size_t i = 0;
__tb_try
{
    i++;
    // 捕獲段錯誤
    *((__tb_volatile__ tb_size_t*)0) = 0;
    // 捕獲除0錯誤
    // __tb_volatile__ tb_size_t a = 0; a /= a;
}
__tb_except(1)
{
    // __tb_except(1): 處理異常
    // __tb_except(0): 路由異常到外層, 支持嵌套處理
}
__tb_end

注意事項

有些平臺異常捕獲是被禁用的,因此若是確實想要使用這種異常捕獲機制,首先得確保對應平臺下的配置文件plat/xxx/config.h優化

定義了TB_CONFIG_EXCEPTION_ENABLE這個宏,而後從新編譯才行。.net

雖然tbox對異常支持的挺完善了,可是我的仍是不建議太過頻繁的使用異常捕獲。線程


相關文章
相關標籤/搜索