C++程序異常時怎麼處理

程序崩潰定位以及準備

如何定位程序異常

1. 文檔說明


 
  1. 主要是針對Windows下的程序崩潰異常,以下是結合實際經驗以及借鑑網上的參考,得出的小結,具有一定實際意義。

2. 分析說明


 
  1. 程序運行時異常崩潰無法避免,需要快速定位以下幾個情況:
  2. 1.必現的崩潰異常,直接用VS進行調試運行,加斷點調試,崩潰時ALT+2查看堆棧。
  3. 2.對於實際運行中的異常,不好直接定位,需要我們結合實際情況提前做好準備和分析。

3. 解決思路


 
  1. 主要針對第2種情況比較複雜,參考以下,在《Windows核心編程》中有部分參考:
  2. 1. 崩潰時,添加回調函數,來進入具體的異常處理代碼段;
  3. 2. 在註冊的回調函數中,輸出崩潰的詳細信息(堆棧信息等);
  4. 3. 結合工程輸出的MAP文件,參考內存地址找到崩潰的函數;

4. 具體操作

4.1 註冊異常處理函數


 
  1. 用SetUnhandledExceptionFilter註冊自定義的錯誤處理回調函數,打印出崩潰時候的異常堆棧信息。
  2. 可以參考網絡教程;

4.2 輸出崩潰信息

4.2.1 回調函數原型:


 
  1. typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
  2. __in struct _EXCEPTION_POINTERS *ExceptionInfo
  3. );
  4. 返回值:EXCEPTION_CONTINUE_EXECUTION – 錯誤已經被修復,從異常發生處繼續執行
  5. EXCEPTION_CONTINUE_SEARCH – 繼續查找異常過濾器
  6. EXCEPTION_EXECUTE_HANDLER – 正常返回
  7. 參數: 崩潰信息結構,包含崩潰原因、崩潰模塊、崩潰地址、崩潰堆棧等;

4.2.2 結構體信息


 
  1. 關鍵是這個結構體,詳細定義可以參考網絡教程
  2. typedef struct _EXCEPTION_POINTERS {
  3. PEXCEPTION_RECORD ExceptionRecord;
  4. PCONTEXT ContextRecord;
  5. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

4.3 編譯生成map文件


 
  1. 以VS2010爲例
  2. 生成的文件

4.4 結合堆棧信息分析


 
  1. 根據出錯的內存地址,在MAP文件中,大致推算出運行的堆棧信息,結合具體的代碼段分析

 

5. 個人總結的常用幾個錯誤

     

0xc0000005

 

需要注意以下幾點:

無效的參數錯誤,我在工作中可能的原因有:

1. sprintf_s失敗,後目的字符串變成NULL,歸根到底還是長度要注意限制;比如我常這樣用

 

sprintf_s(strPrintf,len*4+10,"心跳數據:UID=%s,Data=%s",heart_date.myUID,orgData);
Server_Log(strPrintf);
需要注意,當輸入的字符串大於strPrintf字符串長度時,sprintf_s會報此錯誤,同時返回的字符串是空,該異常可以用_setexceptionhandle捕捉;
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章