dump代码提取

直接上代码

运行环境为Vs2003及vs2013

BugDump.h

/********************************************************************
	描述:	bug处理模块
*********************************************************************/
#pragma once



class CBugDump
{
	//	NO_COPY_CLASS(CBugDump);

public:

	//启用或者停用bug处理功能
	static BOOL Enable(BOOL bEnable);

private:
	static LONG WINAPI OnUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo);

};
bugdump.cpp

#include "stdafx.h"
#include "BugDump.h"
#include <dbghelp.h>
#include <tchar.h>
#include <string>
#include <cstdlib>
#include <iostream>


/*
BOOL WINAPI MiniDumpWriteDump(  
__in  HANDLE hProcess,  
__in  DWORD ProcessId,  
__in  HANDLE hFile,  
__in  MINIDUMP_TYPE DumpType,  
__in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,  
__in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,  
__in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam  
);  
*/
typedef BOOL (WINAPI *fnMiniDumpWriteDump)(HANDLE ,DWORD ,HANDLE ,MINIDUMP_TYPE ,
										   PMINIDUMP_EXCEPTION_INFORMATION ,PMINIDUMP_USER_STREAM_INFORMATION ,
										   PMINIDUMP_CALLBACK_INFORMATION );


BOOL CBugDump::Enable(BOOL bEnable)
{
	if(bEnable)
	{
		HMODULE hDll = LoadLibrary(_T("dbghelp.dll"));
		if(hDll == NULL)
			return FALSE;

		fnMiniDumpWriteDump fn = reinterpret_cast<fnMiniDumpWriteDump>(GetProcAddress(hDll,"MiniDumpWriteDump"));
		::FreeLibrary(hDll);

		if(fn == NULL)
			return FALSE;

		LPTOP_LEVEL_EXCEPTION_FILTER lpOld = SetUnhandledExceptionFilter(&CBugDump::OnUnhandledExceptionFilter);
		lpOld = SetUnhandledExceptionFilter(&CBugDump::OnUnhandledExceptionFilter);
		lpOld = NULL;
	}
	else
	{
		SetUnhandledExceptionFilter(NULL);
	}

	return TRUE;
}

LONG WINAPI CBugDump::OnUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* pExceptionInfo)
{
	LONG lRetValue = EXCEPTION_CONTINUE_SEARCH;

	HMODULE hDll = LoadLibrary(_T("dbghelp.dll"));
	if(hDll)
	{   
		fnMiniDumpWriteDump fn = reinterpret_cast<fnMiniDumpWriteDump>(GetProcAddress(hDll,"MiniDumpWriteDump"));
		if(fn)
		{
			TCHAR szFullPath[MAX_PATH];
			GetModuleFileName(NULL,szFullPath,MAX_PATH);
			TCHAR drive[_MAX_DRIVE]={};//c:
			TCHAR dir[_MAX_DIR]={};// \sample\ctrl
			TCHAR fname[_MAX_FNAME]={};// gameserver
			TCHAR ext[_MAX_EXT]={};	// exe
 			_tsplitpath(szFullPath,drive,dir, fname, ext);
 			
			//当前时间
			SYSTEMTIME sysTime;
			GetLocalTime(&sysTime);
			CString szFileName;
			szFileName.Format(TEXT("%s:/%s/%s_%d%d%d%d%d%d.dmp"),drive,dir,fname,sysTime.wYear,sysTime.wMonth,sysTime.wDay,
				sysTime.wHour,sysTime.wMinute,sysTime.wSecond);

			TCHAR* pszFileName = new TCHAR[MAX_PATH];
			pszFileName = szFileName.GetBuffer(szFileName.GetLength());
			szFileName.ReleaseBuffer();

			HANDLE hFile = CreateFile(pszFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

			delete[] szFileName;
			pszFileName = NULL;

			if(INVALID_HANDLE_VALUE!=hFile)
			{
				_MINIDUMP_EXCEPTION_INFORMATION ExInfo = {0};
				ExInfo.ThreadId = GetCurrentThreadId();
				ExInfo.ExceptionPointers = pExceptionInfo;
				ExInfo.ClientPointers = NULL;

				BOOL bRet = fn(GetCurrentProcess(),GetCurrentProcessId(),hFile,MiniDumpWithFullMemory,&ExInfo,NULL,NULL);

				CloseHandle(hFile);

				if(bRet)
				{
					// 						CString strCmd;
					// 						strCmd.Format(_T("-filename=%s -exename=博乐游戏 -shellname=minboohall.exe"),szFileName);
					// 						
					// 						CString strExt = szExt;
					// 						strExt.MakeLower();
					// 						if(strExt == _T(".exe"))
					// 							strCmd+=_T(" -restart=true");
					// 						else
					// 							strCmd+=_T(" -restart=disable");
					// 
					// 						//执行文件
					// 						HANDLE hReport = ShellExecute(NULL,_T("Open"),_T("BugReporter.exe"),strCmd,NULL,SW_SHOW);
					// 						if(HandleToLong(hReport)>32)
					// 						{
					// 							lRetValue = EXCEPTION_EXECUTE_HANDLER;
					// 						}
				//	std::wstring info = std::wstring(L"提交错误日志文件") + std::wstring( szFileName );
				//	MessageBox( NULL, info.c_str(), L"debug", 0 );
				}
				else
				{
					DeleteFile(szFileName);
				}

			}

		}
		::FreeLibrary(hDll);
		hDll = NULL;
	}

#ifndef _DEBUG
	if (EXCEPTION_EXECUTE_HANDLER == lRetValue)
		ExitProcess(0);
	else
		return lRetValue;


#endif
	return lRetValue;
}

看看得懂的人看哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶是江湖中人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值