Windowsの下でどのようにプログラムの優雅な退出を譲ります
4934 ワード
Windowsの下でどのようにプログラムの優雅な退出を譲ります
WindowsでC++コードを書くとメモリクラッシュの問題に遭遇することが多いexeプログラムが本番環境で実行されている間に、奇妙なメモリクラッシュが原因でプログラムが終了した場合、プログラムが終了したときにクラッシュレポートを生成し、優雅にプログラムを終了する必要があります.まず、システム関数 を理解する必要がある.コード実装
WindowsでC++コードを書くとメモリクラッシュの問題に遭遇することが多いexeプログラムが本番環境で実行されている間に、奇妙なメモリクラッシュが原因でプログラムが終了した場合、プログラムが終了したときにクラッシュレポートを生成し、優雅にプログラムを終了する必要があります.
SetUnhandledExceptionFilter()
//
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
__in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
// lpTopLevelExceptionFilter
// :
//EXCEPTION_EXECUTE_HANDLER 0x1
//EXCEPTION_CONTINUE_EXECUTION 0xffffffff
//EXCEPTION_CONTINUE_SEARCH 0x1
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)GetCrashInfoCallBack);
long _stdcall GetCrashInfo(_EXCEPTION_POINTERS* pexcp)
{
char szDumpFile[1024];
sprintf(szDumpFile,"%s.DUMP",argv[0]);
HANDLE hDumpFile = CreateFileA(szDumpFile,GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pexcp;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// Dump
::MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
}