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

Go语言添加向量异常处理程序(VEH)后无法继续执行问题

捕获Windows异常并读取线程上下文寄存器时的VEH崩溃问题

需求

通过Windows API的AddVectoredExceptionHandler实现向量异常处理程序(VEH),以此捕获Windows异常并读取线程上下文寄存器。

自定义VEH添加函数实现

type PVECTORED_EXCEPTION_HANDLER func(ExceptionInfo *EXCEPTION_POINTERS) uintptr

func AddVEH(myHandler PVECTORED_EXCEPTION_HANDLER) error {
    kernel32 := syscall.NewLazyDLL("kernel32.dll")
    addVectoredExceptionHandler := kernel32.NewProc("AddVectoredExceptionHandler")

    _, _, err := addVectoredExceptionHandler.Call(
        uintptr(1),
        syscall.NewCallback(func(exceptionInfo *EXCEPTION_POINTERS) uintptr {
            return myHandler(exceptionInfo)
        }),
    )
    if err != nil {
        fmt.Println("Error Setting the VEH")
        fmt.Println(err.Error())
    }
    return err
}

测试代码

func myHandler(exceptionInfo *handler.EXCEPTION_POINTERS) uintptr {
    println("Exception occurred! ---> Code")
    println(exceptionInfo.ExceptionRecord.ExceptionCode)
    println("It happends in life, lets continue")
    return ^uintptr(0) // EXCEPTION_CONTINUE_EXECUTION = -1
}

func main() {
    handler.AddVEH(myHandler)

    raiseCustomException() // 通过Windows API RaiseException触发自定义异常,异常码0xE0000001

    println("Continued")
}

问题现象

预期返回EXCEPTION_CONTINUE_EXECUTION后程序会执行println("Continued"),但实际进入异常处理函数后程序崩溃,输出如下栈跟踪:

Error Setting the VEH
    The operation completed successfully.
Exception occurred! ---> Code
3758096385
It happends in life, lets continue
Exception 0xe0000001 0x7eb71d5fb17c 0x1b 0x7ffc54e4b699
PC=0x7ffc54e4b699

runtime.cgocall(0xf1dde0, 0xc000049b30)
        runtime/cgocall.go:167 +0x3e fp=0xc00006fe28 sp=0xc00006fdc0 pc=0xf10a7e
syscall.SyscallN(0xc00001e410?, {0xc0000121c0?, 0x0?, 0xf39a00?})

目前怀疑问题由syscall.NewCallback导致。

补充说明

已知Go的defer/recover异常处理机制,但必须使用VEH来读取线程上下文寄存器,该问题已在golang-nuts邮件组提问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:53:25