Windows 下如何让程序优雅的退出
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);
}