windows 如何在Go语言中捕获0xC0000005访问冲突[closed]

mwg9r5ms  于 2022-12-05  发布在  Windows
关注(0)|答案(1)|浏览(360)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答案。

这个问题是由一个打字错误或一个无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
9小时前关门了。
Improve this question
我目前的项目涉及到使用C编写的程序来执行Go语言中的一个程序,这个程序经常需要阅读内存。有时候我不知道内存区域的保护,当我试图读取它时,我的程序就关闭了。我查看了一个调试器,发现它退出时出现错误3221225477,即0xC0000005访问冲突。在我的Go语言应用程序中,有没有可能捕捉到这种错误?如果没有,我能在我的C代码中捕捉到这种错误吗?
我已经在C代码中添加了AddVectoredExceptionHandler(1, &VHandler);来执行这个进程,虽然它在C中捕获了异常,但它没有捕获Go进程中的错误。

svgewumm

svgewumm1#

在Go语言中,我们可以使用recover函数来捕捉并恢复崩溃,下面是一个例子,说明如何使用recover函数来恢复访问冲突:

package main

import (
    "fmt"
    "runtime"
    "unsafe"
)

func main() {
    // Set up a function to catch any panics and recover from them.
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Caught panic:", err)
        }
    }()

    // Attempt to read from an invalid memory address.
    // This will cause a panic and trigger our recovery function.
    var ptr unsafe.Pointer
    *ptr = 0
}

在这个例子中,当程序试图取消引用ptr变量时,程序会出现异常,因为ptr变量还没有初始化。defer语句设置了一个函数,当主函数返回时,无论它是正常返回还是出现异常,都会调用该函数。该函数将调用recover来捕获异常并从中恢复,同时输出错误消息。
在您的情况下,您可能希望将任何访问内存的代码 Package 在一个defer语句中,如下图所示,以捕获任何混乱并从中恢复。请注意,从混乱中恢复并不能保证程序将继续正常工作,因此您仍应尽可能避免访问无效内存。
至于捕捉C++代码中的死机,我们可以使用运行时包中的recover函数来捕捉Go语言代码引发的死机。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "runtime.h"
#include "go.h"

int main() {
    // Set up a function to catch panics and recover from them.
    // This is similar to the defer statement in Go.
    _go_defer_recover([]{
        if (void *err = _go_recover(NULL); err != NULL) {
            printf("Caught panic: %s\n", (const char *)err);
            free(err);
        }
    });

    // Call a Go function that may panic.
    // This will trigger our recovery function if the Go function panics.
    CallGoFunction();

    return 0;
}

这个例子使用了运行时包中的_go_defer_recover和_go_recover函数来捕捉Go语言代码抛出的异常,它与Go语言中的defer和recover函数类似,但它是用C++实现的,它设置了一个函数,当主函数返回时,将调用该函数。这个函数将调用_go_recover来捕获任何死机并从中恢复,同时输出错误消息。
请注意,为了使用这些函数,您需要包含Go语言运行库中的runtime.h和go.h头文件,您可以在$GOROOT/src目录中找到这些头文件,其中$GOROOT是Go语言的安装路径。
我希望这对你有帮助!

相关问题