1. 程式人生 > >c++ dmp檔案生成與分析

c++ dmp檔案生成與分析

    目前做一個專案,利用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開啟


點選 使用僅限本機 進行除錯,就會定位問題的所在了。