天天看點

Win32程式異常捕獲處理Win32程式異常捕獲處理

Win32程式異常捕獲處理

作者: MrZhu007

日期; 2019-10-24

部落格位址:金色世界

背景說明

程式發生異常時,直接以崩潰(閃退)的方式退出,給使用者造成不友好的體驗。

程式設計環境C/C++。VS/MFC界面架構

常見崩潰閃退種類及來源

  • 通路錯誤
    • 數組索引通路越界
    • 指針對象通路越界
    • 通路空指針對象
    • 通路無效指針對象
    • 疊代器通路越界
  • 類型錯誤
    • 使用C格式進行強制轉換。
  • 堆棧溢出
    • 遞歸調用
    • 循環調用
    • 消息循環
    • 大對象參數
    • 大對象變量
    • 記憶體不足
  • 異常錯誤來源
    • C++标準異常
    • Windows平台Api異常、運作庫異常等等結構化異常

錯誤處理模型

結構化異常處理,是Windows作業系統上,Microsoft對C/C++程式語言做的文法擴充,用于處理異常事件的程式控制結構。

異常事件是打斷程式正常執行流程的不在期望之中的硬體、軟體事件。硬體異常是CPU抛出的如“除0”、數值溢出等;

結構化異常文法

__try
 { 
	// 受保護執行的代碼
 }
__except ( 過濾表達式 ) 
{ 
  	// 異常處理代碼 
}

__try 
{ 
	// 受保護執行的代碼 
} 
__finally 
{ 
	// 清理用途的代碼 
}
           

軟體異常是作業系統與程式通過RaiseException語句抛出的異常。

編譯選項可以指定編譯器使用的錯誤處理模型

  • EHa

    捕獲結構化異常和C++異常以C++文法try…catch(…)文法

  • EHsc

    捕獲C++異常和結構化異常,結構化異常在win32平台使用__try __except _finally文法,并假定C函數不會引發C++異常。此選項是VS工程預設值

  • EHs

    僅捕獲C++異常

  • 不使用異常

    常見崩潰閃退的錯誤一般都為結構化異常。來源種類除了C++标準異常,剩下為結構化異常

軟體現狀

錯誤處理模型為Ehsc。

使用SetUnhandledExceptionFilter函數。接手軟體發生崩潰退出時最後控制。這時候隻能進行堆棧等資訊列印儲存,友善問題定位。

一般使用MiniDumpWriteDump平台Api生成小型轉存儲檔案xxx.dmp.該檔案記錄軟體崩潰時現場。需要對應的pdb符号檔案。

但不能解決軟體出現類似空指針通路的時候還能繼續運作。

初步解決思路

合适的地方使用結構化異常捕獲文法。捕獲錯誤,重新運作。不合适的地方,使用轉存儲檔案記錄

繼續閱讀