使用dbghelp生成dump文件以及過後調試分析


前言


在產品的實際應用環境中,若是咱們的程序在客戶那裏出現了問題,例如程序異常了,而這個時候的現象又不能還原或者很難還原重現,那麼只有使用dump文件來保存程序的當前運行信息,例如調用堆棧等,同時使用符號文件來定位問題了;這裏主要講解使用dbghelp庫來生成輸出dump文件,同時使用符號文件和windbg來分析問題。

樣例代碼


ios

 1 #include "stdafx.h"
 2 #include <Windows.h>
 3 #include <iostream>
 4 #include "dbghelp.h"
 5 using namespace std;
 6 LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo)  
 7 {
 8     cout << "Enter TopLevelExceptionFilter Function" << endl;  
 9     HANDLE hFile = CreateFile(  _T("project.dmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);  
10     MINIDUMP_EXCEPTION_INFORMATION stExceptionParam;  
11     stExceptionParam.ThreadId    = GetCurrentThreadId();  
12     stExceptionParam.ExceptionPointers = pExceptionInfo;  
13     stExceptionParam.ClientPointers    = FALSE;  
14     MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpWithFullMemory,&stExceptionParam,NULL,NULL);  
15     CloseHandle(hFile);  
16     getchar();
17     return EXCEPTION_EXECUTE_HANDLER;
18 }
19 
20 int _tmain(int argc, _TCHAR* argv[])
21 {
22     cout<<"Enter Main Function"<<endl;
23     SetUnhandledExceptionFilter(TopLevelExceptionFilter); 
24     int *pValue = NULL;
25     cout<<"Invalid Access"<<endl;
26     *pValue = 0;
27     cout<<"Finish Main Function"<<endl;
28     getchar();
29 
30     return 0;
31 }

該段代碼很簡單,有幾個API函數你們查查msdn便可;我就再也不講解了.

工程設置

因爲使用了dbghelp庫,所以咱們須要配置庫依賴以及頭文件包含信息;設置頭文件包含以下圖所示:



函數

設置庫文件依賴以下圖所示:





設置好以後,便可成功編譯該工程代碼,同時將dbghelp.dll文件放入可執行文件目錄下;最後結果以下圖所示:



因爲我默認設置了生成符號文件,即DumpProject.pdb文件;關於符號文件的生成,以下圖設置所示:





運行程序

雙擊DumpProject.exe文件,根據代碼邏輯,因爲程序有異常,所以會生成dump文件,運行結果以下圖所示:



同時生成了project.dmp文件,以下圖所示:



分析問題

獲得了dmp文件,符號文件,同時又有對應的源碼,這時使用WinDbg工具來解決問題,找出異常出在哪裏。

打開WinDbg工具,設置好符號文件位置目錄,源碼文件位置目錄,而後打開project.dmp文件,顯示以下所示:



在WinDbg命令行中輸入以下!analyze -v命令,從而能夠分析出異常出現的具體位置,以下圖所示:



結束

方便快捷的定位分析問題,提升效率;工具

相關文章
相關標籤/搜索