程序崩潰時生成DUMP文件

//首先,定義異常處理函數
LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
	typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
		HANDLE,
		DWORD,
		HANDLE,
		MINIDUMP_TYPE,
		PMINIDUMP_EXCEPTION_INFORMATION,
		PMINIDUMP_USER_STREAM_INFORMATION,
		PMINIDUMP_CALLBACK_INFORMATION
		);

	MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
	HMODULE hDbgHelp = LoadLibrary("DbgHelp.dll");
	if (hDbgHelp)
	{
		pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
	}

	if (pfnMiniDumpWriteDump)
	{
		char szFileName[MAX_PATH] = { 0 };
		::GetModuleFileName(NULL, szFileName, _MAX_PATH);
		string str = szFileName;
		str = str.substr(0, str.length() - 4) + ".dmp";

		HANDLE hFile = ::CreateFile(str.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile != INVALID_HANDLE_VALUE)
		{
			MINIDUMP_EXCEPTION_INFORMATION einfo;
			einfo.ThreadId = ::GetCurrentThreadId();
			einfo.ExceptionPointers = lpExceptionInfo;
			einfo.ClientPointers = FALSE;

			pfnMiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &einfo, NULL, NULL);
			::CloseHandle(hFile);
		}

		return EXCEPTION_EXECUTE_HANDLER;
	}

	if (hDbgHelp != NULL)
	{
		FreeLibrary(hDbgHelp);
	}

	return EXCEPTION_EXECUTE_HANDLER;
}

//爲程序設置異常處理函數

SetUnhandledExceptionFilter(ExceptionFilter);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章