SetUnhandledExceptionFilter 不适用于提升上下文

SetUnhandledExceptionFilter does not work with boost context

我正在使用来自 boost 上下文的 make_fcontextjump_fcontext 来实现用户空间上下文切换。我使用另一个库来捕获和报告应用程序崩溃。我发现这两个在 Windows.

上不能一起工作

崩溃库在启动期间调用 SetUnhandledExceptionFilter 以设置 异常处理程序 以捕获进程中未处理的异常。然后它处理崩溃报告的异常记录。这在大多数情况下都有效,并且我的应用程序中没有其他异常处理。

但是,当在 boost 上下文中的线程 运行 中发生崩溃(hardware/software 异常)时,我发现设置 exception handler 是没有触发。似乎内核启动了 WerFault.exe,它在 C:\Windows\System32\config\systemprofile\AppData\Local\CrashDumps.

下生成了一个小型转储

boost 上下文中的 运行 似乎会影响内核查找或使用已取代的全局未处理异常过滤器的能力。当 运行 在 boost 上下文中时,栈底看起来像:

...
my_context_function
make_fcontext+0x76

虽然 运行 在正常 Windows 堆栈上:

...
my_thread_start_function
KERNEL32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

我想知道这里可能出了什么问题。我是 Windows 和 SEH 的新手,如果问题不合理,请提前致歉。

我认为这是默认上下文的限制,它不会执行 Windows 所做的所有事情,这不太可能为您修复。如果你想要完全支持 Windows 东西,你可能应该切换到 Windows 光纤。看起来像 Boost Context supports them.

使用 Windows 光纤的缺点可能是性能较差。

如果这对您很重要,您可能必须使用快速上下文,并拥有自己的 SEH 框架:

__try 
{ 
   ... 
} 
__except(UnhandledExceptionFilter(GetExceptionInformation()) 
{
}

当然,这不能保证完全重复 Windows 内部处理。但是您只需要做对您重要的事情,不必重复整个 Windows 内部结构。

SEH 框架可以集中在包装函数中。或者,您可以尝试 AddVectoredContinueHandler(据我所知,矢量继续处理程序在基于帧的处理程序之后调用,不像 AddVectoredExceptionHandler 在它们之前调用)。