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符号檔案。
但不能解決軟體出現類似空指針通路的時候還能繼續運作。
初步解決思路
合适的地方使用結構化異常捕獲文法。捕獲錯誤,重新運作。不合适的地方,使用轉存儲檔案記錄