⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 solardump.cpp

📁 奇迹世界公用文件源代码,研究网络游戏的朋友可以研究下
💻 CPP
字号:
#include "UtilityCommon.h"
#include ".\solardump.h"
#include <time.h>
#include "SolarAssert.h"

typedef BOOL (WINAPI * fnMINIDUMPWRITEDUMP)(
    HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
    CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
    CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
    CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam
    );

MINIDUMP_TYPE	SolarDump::s_eDumpType			= MiniDumpNormal;
TCHAR			SolarDump::s_pszDumpFileDir[]	= {0,};
TCHAR			SolarDump::s_pszFilePrefix[]	= {0,};

SolarDump::SolarDump( TCHAR * pszDir, MINIDUMP_TYPE eDumpType )
{	
	//ASSERT( !IsBadReadPtr( pszDir, sizeof(pszDir) ) );

	lstrcpyn( s_pszDumpFileDir, pszDir, MAX_PATH );

	TCHAR szFilename[MAX_PATH];
    GetModuleFileName( NULL, szFilename, MAX_PATH );

	TCHAR * slash = strrchr( szFilename, '\\' );
    TCHAR * dot = strrchr( slash+1, '.' );
    ::lstrcpyn( s_pszFilePrefix, slash+1, (int)(dot - slash) );
	

	s_eDumpType = eDumpType;
	
	::SetUnhandledExceptionFilter( ExceptionFilter );
}

SolarDump::~SolarDump()
{
	
}


LONG WINAPI SolarDump::ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionInfo )
{
	LONG rt = EXCEPTION_CONTINUE_SEARCH;

	if( pExceptionInfo == NULL )
	{
		static BOOL first = FALSE;
		if( first ) return rt;
		first = TRUE;

		__try 
		{
			RaiseException( EXCEPTION_BREAKPOINT, 0, 0, NULL );
		} 
		__except( ExceptionFilter( GetExceptionInformation() ), EXCEPTION_CONTINUE_EXECUTION ) 
		{
		}
		return rt;
	}
	// 泅犁 版肺俊辑 dll肺靛
	TCHAR pszDllPath[MAX_PATH];
	wsprintf( pszDllPath, "%s\\DBGHELP.DLL" );
	HANDLE hDLL = ::LoadLibrary( pszDllPath );
	if( !hDLL ) hDLL = ::LoadLibrary( "DBGHELP.DLL" );
	if( NULL == hDLL )
    {
		SASSERT(NULL, "DBGHELP.DLL阑 肺靛且 荐 绝嚼聪促." );
        return rt;
    }

	fnMINIDUMPWRITEDUMP pfnMiniDumpWriteDump = (fnMINIDUMPWRITEDUMP)GetProcAddress( (HMODULE)hDLL, "MiniDumpWriteDump" );
	if( NULL == pfnMiniDumpWriteDump )
    {
		SASSERT(NULL, "坷贰等 滚傈狼 DBGHELP.DLL涝聪促. 弥脚滚傈栏肺 诀单捞飘 窍矫扁 官而聪促." );
        return rt;
    }

	struct tm * today;
	time_t		ltime;
	time( &ltime );
	today = localtime( &ltime );

	char szDumpPath[MAX_PATH*2];
	wsprintf( szDumpPath, 
		"%s\\%s%02d-%02d-%02d=%02dh%02dm%02ds.dmp", 
		s_pszDumpFileDir, 
		s_pszFilePrefix, 
		today->tm_year+1900, 
		today->tm_mon+1, 
		today->tm_mday, 
		today->tm_hour, 
		today->tm_min, 
		today->tm_sec );

    HANDLE hFile = CreateFile( szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    if( INVALID_HANDLE_VALUE == hFile )
    {
		SASSERT(NULL, VSTR( "[%s]颇老阑 凯 荐 绝嚼聪促.", szDumpPath ) );
        return rt;
    }

	MINIDUMP_EXCEPTION_INFORMATION eInfo;
	eInfo.ThreadId				= GetCurrentThreadId();
	eInfo.ExceptionPointers		= pExceptionInfo;
	eInfo.ClientPointers		= FALSE;

	BOOL bResult = pfnMiniDumpWriteDump( GetCurrentProcess(), 
		GetCurrentProcessId(), 
		hFile, 
		s_eDumpType, 
		(pExceptionInfo?&eInfo:NULL), 
		NULL, NULL);

    if( !bResult )
    {
		SASSERT(NULL, "MiniDumpWriteDump() 龋免捞 角菩沁嚼聪促." );
		CloseHandle(hFile);
		return ( rt = EXCEPTION_EXECUTE_HANDLER );
    }

    CloseHandle( hFile );

	return rt;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -