You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SetUnhandledExceptionFilter搭配boost context在Windows下不生效问题咨询

Boost Context与Windows全局异常捕获不兼容的核心成因
  • 栈结构不符合系统异常分发要求

    你通过SetUnhandledExceptionFilter注册的全局异常处理函数,本质是Windows用户态异常分发流程的最后一步,该逻辑硬编码在ntdll!RtlUserThreadStart和KERNEL32!BaseThreadInitThunk的执行链路中。当异常完成所有栈帧的SEH处理仍未被捕获时,系统会沿着栈回溯到这两个系统原生栈底帧,再调用注册的全局回调。
    Boost Context的fcontext是纯用户态实现的协程上下文,使用自行分配的栈内存,栈底只有make_fcontext的汇编帧,没有系统原生线程的两个栈底帧。异常分发走到栈底时,系统会判定栈结构非法,直接跳过全局异常回调的调用流程,触发WerFault生成系统级转储。
  • 异常展开信息缺失导致栈展开失败

    64位Windows的异常处理依赖PE文件中存储的RUNTIME_FUNCTION展开表,每个需要参与异常展开的函数都需要在表中注册对应的栈展开规则。make_fcontext是汇编实现的函数,部分版本的Boost Context没有为其注册合法的展开信息,当异常展开到make_fcontext+0x76位置时,系统找不到对应的展开规则,判定栈展开失败,直接终止进程,不会再触发用户注册的全局异常回调。
  • 32位平台额外影响因素

    32位Windows下SEH依赖线程信息块(TIB)中FS[0]指向的栈上SEH链,若Boost Context切换上下文时未同步保存/恢复该SEH链头指针,也会导致异常分发时无法找到合法的SEH处理链,直接终止进程。
  • 简易验证方案

    可以调用AddVectoredExceptionHandler注册向量异常处理函数,VEH的调用优先级高于所有栈帧的SEH处理,不依赖栈展开流程。如果VEH可以正常捕获到协程上抛出的异常,即可确认问题出在后续的栈展开阶段,符合上述成因。

内容的提问来源于stack exchange,提问作者yijiem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:36:02