前言
在產品的實際應用環境中,若是咱們的程序在客戶那裏出現了問題,例如程序異常了,而這個時候的現象又不能還原或者很難還原重現,那麼只有使用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命令,從而能夠分析出異常出現的具體位置,以下圖所示:
結束
方便快捷的定位分析問題,提升效率;工具