4

我正在开发一个 C++ 程序(Win32,MS Visual Studio 2008),它通过 JNI 创建一个 Java VM,如此所述。它在 Java 6 和 Java 7 中都运行良好了很长时间。

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

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

有没有办法在 JRE 中检测此类错误,或者更一般地说,在第三方库中检测到此类错误?我尝试使用 C++try/catch构造,我尝试使用信号函数 - 没有任何帮助;程序在没有调用任何 catch 或信号处理程序的情况下消失。

有没有办法检测这种 JRE 崩溃?或者:有没有办法可靠地检测第三方库中的崩溃或终止?

4

1 回答 1

1

如果您使用的是 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,...)。例如,它将捕获 null 取消引用、内存访问问题,这些问题可能是导致崩溃的原因。在这里阅读

否则,在寡妇中,尝试SetUnhandledExceptionFilter

编辑:由于使用 SEH 的方法似乎失败了,您可能会更上一层楼并使用向量异常处理。根据msdn 上的这篇博文,VEH 是按进程注册的,并在 SEH 之前进行检查。

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

于 2013-02-19T13:41:43.353 回答