c++ dmp檔案生成與分析
阿新 • • 發佈:2018-12-24
目前做一個專案,利用mfc做框架生成執行程式,在本機及實驗室的機子裡都能正常執行,但運用到遠端的機器上就崩,而且好像不是程式演算法的問題,不能重現很難定位,所以考慮利用dmp檔案來分析。
1.dmp檔案生成實現程式碼
標頭檔案
#include <DbgHelp.h>
#include <tchar.h>
執行緒函式
LONG _stdcall ApplicationCrashHandler(PEXCEPTION_POINTERS pException) { CreateDumpFile(_T("test.dmp"),pException); FatalAppExit(-1, _T("***Unhandled Exception!***")); return EXCEPTION_EXECUTE_HANDLER; }
void CreateDumpFile(LPCTSTR lpstrDumpFilePathName, EXCEPTION_POINTERS* pException) { HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if ((hDumpFile != NULL) && (hDumpFile != INVALID_HANDLE_VALUE)) { MINIDUMP_EXCEPTION_INFORMATION dumpInfo; dumpInfo.ThreadId = GetCurrentThreadId(); dumpInfo.ExceptionPointers = pException; dumpInfo.ClientPointers = TRUE; ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); } CloseHandle(hDumpFile); }
在dialog初始化中呼叫函式ApplicationCrashHandler(PEXCEPTION_POINTERS pException)
BOOL CCutton_DlgDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將“關於...”選單項新增到系統選單中。 // TODO: 在此新增額外的初始化程式碼 SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE }
2. 工程配置
3.dmp檔案分析
生成的dmp檔案必須與之前的pdb檔案相對應,雙擊dmp檔案,利用vs開啟
點選 使用僅限本機 進行除錯,就會定位問題的所在了。