**已关闭。**此问题为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进程中的错误。
1条答案
按热度按时间svgewumm1#
在Go语言中,我们可以使用recover函数来捕捉并恢复崩溃,下面是一个例子,说明如何使用recover函数来恢复访问冲突:
在这个例子中,当程序试图取消引用ptr变量时,程序会出现异常,因为ptr变量还没有初始化。defer语句设置了一个函数,当主函数返回时,无论它是正常返回还是出现异常,都会调用该函数。该函数将调用recover来捕获异常并从中恢复,同时输出错误消息。
在您的情况下,您可能希望将任何访问内存的代码 Package 在一个defer语句中,如下图所示,以捕获任何混乱并从中恢复。请注意,从混乱中恢复并不能保证程序将继续正常工作,因此您仍应尽可能避免访问无效内存。
至于捕捉C++代码中的死机,我们可以使用运行时包中的recover函数来捕捉Go语言代码引发的死机。
这个例子使用了运行时包中的_go_defer_recover和_go_recover函数来捕捉Go语言代码抛出的异常,它与Go语言中的defer和recover函数类似,但它是用C++实现的,它设置了一个函数,当主函数返回时,将调用该函数。这个函数将调用_go_recover来捕获任何死机并从中恢复,同时输出错误消息。
请注意,为了使用这些函数,您需要包含Go语言运行库中的runtime.h和go.h头文件,您可以在$GOROOT/src目录中找到这些头文件,其中$GOROOT是Go语言的安装路径。
我希望这对你有帮助!