SetUnhandledExceptionFilter 不适用于提升上下文
SetUnhandledExceptionFilter does not work with boost context
我正在使用来自 boost 上下文的 make_fcontext
和 jump_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
在它们之前调用)。
我正在使用来自 boost 上下文的 make_fcontext
和 jump_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
在它们之前调用)。