Я разрабатываю программу на C++ (Win32, MS Visual Studio 2008), которая создает Java-виртуальную машину через JNI, как указано here. Он работает отлично в течение длительного времени, как с Java 6, так и с Java 7.Вызов Java из C++: как поймать/обнаружить фатальную ошибку JVM?
Сегодня я установил новую версию JRE; в установщике что-то пошло не так, и JRE стал коррумпированным. Я заметил, что моя программа на C++ не запускается и не выдает никаких предупреждающих сообщений. Отладка программы показала, что она успешно работает до вызова JNI_CreateJavaVM
; но вызов JNI_CreateJavaVM
заставляет программу немедленно завершать работу. Нет возвращаемых значений, сообщений об ошибках, ничего.
Да, я знаю, что мне просто нужно переустановить JRE. Но тем не менее я бы хотел, чтобы моя программа на C++ была подготовлена к такой ситуации. Если он не может создать виртуальную машину Java, он должен показать сообщение «Пожалуйста, переустановите JRE». Но у меня нет возможности показать это сообщение, потому что вся программа завершается.
Есть ли способ обнаружить такие ошибки в JRE или, более широко, в сторонней библиотеке? Я попытался использовать конструкции C++ try/catch
, я попытался использовать функцию signal - ничего не помогает; программа исчезает, не вызывая никаких уловов или обработчиков сигналов.
Есть ли способ обнаружить такие аварии JRE? Или: есть ли способ надежно обнаружить сбой или завершение внутри сторонней библиотеки?
В какой среде? Существуют зависимые от ОС/зависимые от компилятора способы (например, __try __except на MS C++) –
Или [SetUnhandledExceptionFilter] (http://msdn.microsoft.com/en-us/library/ms680634%28VS.85%29.aspx) для win32 –
@ dema80, да, это Win32. Спасибо за подсказку, я отредактировал вопрос. –