最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

windows - Cannot continue after entering Vectored Exception Handler in Go - Stack Overflow

programmeradmin3浏览0评论

I want to be able to catch windows exception and do stuff with it (mainly read the register in the thread context).

I created a custom function to add a Vectored Exception Handler using the windows API call AddVectoredExceptionHandler:

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
}

I test it with a custom exception I raise:

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() // Just Raises a custom EXCEPTION with RaiseException winapi and code 0xE0000001

    println("Continued")
}

As I return with EXCEPTION_CONTINUE_EXECUTION, I expect that println("Continued") will be executed. However, it is not the case at all:

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?})

As you see the program enter the handler function but never continues, rather it exit and print the stack trace...

Not sure if it is because of syscall.NewCallback or something else ...

PS: I know there is defer recover mechanism in Go that can be used to handle exception... But I would like to use AddVectoredExceptionHandler (maybe it is already used behind the scene with defer recover ?) because I can inspect the thread context in myhandler function

Question already asked in golang-nuts this morning.

发布评论

评论列表(0)

  1. 暂无评论