Files
ls-2019-source/extra/LS_Service/LS_controller/cMiniDump.cpp
T
2026-11-07 13:30:45 +07:00

111 lines
3.1 KiB
C++

#include "stdafx.h"
#include "cMiniDump.h"
#include <TCHAR.h>
#include <DBGHELP.h>
TCHAR cMiniDump::m_filename[MAX_PATH];
TCHAR cMiniDump::m_folername[MAX_PATH];
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);
LPTOP_LEVEL_EXCEPTION_FILTER PreviousExceptionFilter = NULL;
LONG WINAPI UnHandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionInfo)
{
HMODULE DllHandle = NULL;
// Windows 2000 이전에는 따로 DBGHELP를 배포해서 설정해 주어야 한다.
DllHandle = LoadLibrary(_T("DBGHELP.DLL"));
if (DllHandle)
{
MINIDUMPWRITEDUMP MiniDumpWriteDump = reinterpret_cast<MINIDUMPWRITEDUMP>(GetProcAddress(DllHandle, "MiniDumpWriteDump"));
if (MiniDumpWriteDump)
{
TCHAR DumpPath[MAX_PATH] = {0};
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
_stprintf_s(
DumpPath,
MAX_PATH-1,
_T("%s\\%s(%04d%02d%02d-%02d%02d%02d).dmp"),
cMiniDump::m_folername,
cMiniDump::m_filename,
SystemTime.wYear,
SystemTime.wMonth,
SystemTime.wDay,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond);
HANDLE hDumpFile = CreateFile(
DumpPath,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
_MINIDUMP_EXCEPTION_INFORMATION ExceptionInfo;
ExceptionInfo.ThreadId = GetCurrentThreadId();
ExceptionInfo.ExceptionPointers = exceptionInfo;
ExceptionInfo.ClientPointers = NULL;
BOOL bSuccess = MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hDumpFile,
MiniDumpNormal,
&ExceptionInfo,
NULL,
NULL);
if (bSuccess)
{
CloseHandle(hDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
CloseHandle(hDumpFile);
}
}
}
return EXCEPTION_CONTINUE_SEARCH;
}
BOOL cMiniDump::Begin(const TCHAR* filename)
{
SetErrorMode(SEM_FAILCRITICALERRORS);
TCHAR temp[512];
GetCurrentDirectory(_countof(temp), temp);
_sntprintf_s(m_folername, sizeof(m_folername), _T("%s\\dump"), temp);
CreateDirectory(m_folername, NULL);
_tcscpy_s(m_filename, 260, filename);
PreviousExceptionFilter = SetUnhandledExceptionFilter(UnHandledExceptionFilter);
return TRUE;
}
BOOL cMiniDump::End(VOID)
{
SetUnhandledExceptionFilter(PreviousExceptionFilter);
return TRUE;
}