探索 Windows 平台下的 C++ 异常捕获策略:如何让Windows C++应用程序尽可能捕获所有异常?
Don't lie to yourself.
8 人赞同了该文章
前言
这个标题起的有点纠结,感觉不太好起。实际上本文想要讨论的场景,是一个比较经典的Windows C++商业应用软件的开发需求:我们希望能够在程序发生异常并崩溃时,能够弹出对用户比较友好的崩溃提示窗口,并且生成dump文件上传到服务器上,让开发人员能够获取并分析。
因此,本文提出一套捕获Windows平台下C++程序异常的方案,经过长时间的线上验证,是可以捕获到绝大多数的异常的。至于为什么不是所有异常,我们后面再讨论。
程序示例
先给出程序示例,再讨论其中的原理。
void InstallUnexceptedExceptionHandler()
{
//SEH(Windows 结构化异常处理),属于Win32 API
::SetUnhandledExceptionFilter(UnhandledStructuredException);
//C 运行时库 (CRT) 异常处理,由 CRT 提供的异常处理机制。
_set_purecall_handler(PureCallHandler);
_set_new_handler(NewHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
_set_abort_behavior(_CALL_REPORTFAULT, _CALL_REPORTFAULT);
//C 运行时信号处理,由 CRT 提供的信号处理机制。
signal(SIGABRT, SigabrtHandler);
signal(SIGINT, SigintHandler);
signal(SIGTERM, SigtermHandler);
signal(SIGILL, SigillHandler);
//C++ 运行时异常处理,API由标准库提供
set_terminate(Terminate