从 C++ 调用 Java:如何捕获/检测致命 JVM 错误?

2023-12-22

我正在开发一个 C++ 程序(Win32,MS Visual Studio 2008),它通过 JNI 创建一个 Java VM,如下所示here http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp16334。它在 Java 6 和 Java 7 上都运行良好很长一段时间。

今天我安装了新版本的JRE;安装程序中出现问题,JRE 已损坏。我注意到我的 C++ 程序没有启动,也没有发出任何警告消息。调试程序显示运行成功,直到JNI_CreateJavaVM称呼;但打电话JNI_CreateJavaVM导致程序立即终止。没有返回值,没有错误消息,什么都没有。

是的,我知道我只需重新安装 JRE 即可。但尽管如此,我还是希望我的 C++ 程序能够应对这种情况。如果无法创建 Java VM,则应显示一条消息“请重新安装 JRE”。但我没有机会显示该消息,因为整个程序正在终止。

有没有办法检测 JRE 中的此类错误,或者更一般地说,检测第三方库中的此类错误?我尝试使用 C++try/catch构造,我尝试使用signal http://msdn.microsoft.com/en-us/library/xdkz3x12%28v=vs.71%29.aspx功能——没有任何帮助;程序消失而不调用任何 catch 或信号处理程序。

有没有办法检测此类 JRE 崩溃?或者:有没有办法可靠地检测第三方库内的崩溃或终止?


如果您使用的是 Linux/Unix:我通常会这样开始:

struct sigaction sa;
sa.sa_handler = bt_sighandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;

sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL);

如果您在 Windows 上使用 Microsoft C++:_try/_ except 通常可以解决问题。它是一个 MSVC 扩展(你可以从双下划线看出),它扩展了标准的 try/catch。

Try/catch 捕获 C++ 异常,_try/_except 将捕获所有其他未处理的异常(COM、Win32,...)。例如,它会捕获空解除引用、内存访问问题,这些问题可能是导致崩溃的原因。读here http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx

否则,在寡妇中,尝试设置未处理异常过滤器 http://msdn.microsoft.com/en-us/library/ms680634%28VS.85%29.aspx

编辑:由于使用 SEH 的方法似乎失败了,您可以向上一级并使用向量异常处理。根据msdn 上的这篇博文 http://blogs.msdn.com/b/kirush/archive/2008/04/24/global-crash-handler-for-c-application.aspx,VEH 是按进程注册的,并且在 SEH 之前检查。

如果全部失败,请不要绝望:)您仍然可以将您的应用程序变成一对调试器/被调试者。这将使您完全控制被调试进程的事件、生死。通常不值得这么麻烦,但这是我过去必须使用的额外解决方案。它也并不像看起来那么困难;如果还有其他失败,请告诉我,我会找出一些旧代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C++ 调用 Java:如何捕获/检测致命 JVM 错误? 的相关文章

随机推荐