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
相关产品推荐
相关产品推荐

