Files
Sun1602/Server/AuthSystem/RTT/Library/Report/CrashHandler/MiniDump.cpp
T
2022-10-26 12:25:11 +08:00

64 lines
1.6 KiB
C++

#include <Windows.h>
#include <dbgHelp.h>
#include "MiniDump.h"
typedef BOOL ( WINAPI *MINIDUMPWRITEDUMP )(
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 );
bool MiniDump::GenerateMiniDump( PEXCEPTION_POINTERS exceptionInfo, LPCTSTR dumpFileName )
{
MINIDUMPWRITEDUMP writeDump;
HWND hParent = 0;
HMODULE hDll = 0;
char szDbgHelpPath[_MAX_PATH];
if( GetModuleFileName( 0, szDbgHelpPath, _MAX_PATH ) )
{
char* pSlash = strrchr( szDbgHelpPath, '\\' );
if( pSlash )
{
strcpy( pSlash+1, "DBGHELP.DLL" );
hDll = ::LoadLibrary( szDbgHelpPath );
}
}
if( hDll == 0 )
hDll = ::LoadLibrary( "DBGHELP.DLL" );
if( hDll == 0 )
return false;
writeDump = ( MINIDUMPWRITEDUMP )::GetProcAddress( hDll, "MiniDumpWriteDump" );
if( writeDump != 0 )
{
HANDLE hFile;
hFile = ::CreateFile( dumpFileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, 0 );
if( hFile != INVALID_HANDLE_VALUE )
{
_MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = exceptionInfo;
ExInfo.ClientPointers = 0;
// Write the dump
if( exceptionInfo == 0 )
writeDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, 0, 0, 0 );
else
writeDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, 0, 0 );
::CloseHandle( hFile );
}
}
return true;
}