程序崩潰定位以及準備
如何定位程序異常
1. 文檔說明
主要是針對Windows下的程序崩潰異常,以下是結合實際經驗以及借鑑網上的參考,得出的小結,具有一定實際意義。
2. 分析說明
程序運行時異常崩潰無法避免,需要快速定位以下幾個情況:
1.必現的崩潰異常,直接用VS進行調試運行,加斷點調試,崩潰時ALT+2查看堆棧。
2.對於實際運行中的異常,不好直接定位,需要我們結合實際情況提前做好準備和分析。
3. 解決思路
主要針對第2種情況比較複雜,參考以下,在《Windows核心編程》中有部分參考:
1. 崩潰時,添加回調函數,來進入具體的異常處理代碼段;
2. 在註冊的回調函數中,輸出崩潰的詳細信息(堆棧信息等);
3. 結合工程輸出的MAP文件,參考內存地址找到崩潰的函數;
4. 具體操作
4.1 註冊異常處理函數
用SetUnhandledExceptionFilter註冊自定義的錯誤處理回調函數,打印出崩潰時候的異常堆棧信息。
可以參考網絡教程;
4.2 輸出崩潰信息
typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
__in struct _EXCEPTION_POINTERS *ExceptionInfo
);
返回值:EXCEPTION_CONTINUE_EXECUTION – 錯誤已經被修復,從異常發生處繼續執行
EXCEPTION_CONTINUE_SEARCH – 繼續查找異常過濾器
EXCEPTION_EXECUTE_HANDLER – 正常返回
參數: 崩潰信息結構,包含崩潰原因、崩潰模塊、崩潰地址、崩潰堆棧等;
關鍵是這個結構體,詳細定義可以參考網絡教程
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
4.3 編譯生成map文件
以VS2010爲例
生成的文件
根據出錯的內存地址,在MAP文件中,大致推算出運行的堆棧信息,結合具體的代碼段分析
5. 個人總結的常用幾個錯誤
需要注意以下幾點:
無效的參數錯誤,我在工作中可能的原因有:
1. sprintf_s失敗,後目的字符串變成NULL,歸根到底還是長度要注意限制;比如我常這樣用