java — настройки в JVM, чтобы игнорировать сообщение об ошибке JRE, когда сбой произошел в собственном коде c / c ++?

Я вызываю панель Java Swing из приложения C / C ++, создающего JavaVM (). Все отлично работает По любой причине, если происходит сбой C / C ++, я вижу, что Java Runtime Environment обнаружил фатальную ошибку. Сбой произошел за пределами JVM в собственном коде.

Могу ли я установить в JVM какой-нибудь вариант, чтобы игнорировать ошибки в нативном коде? Ниже сообщение.

Неустранимая ошибка была обнаружена средой выполнения Java:

SIGSEGV (0xb) при pc = 0xfd933144, pid = 29358, tid = 1

Версия JRE: 6.0_22-b04 Java VM: клиентская виртуальная машина Java HotSpot (TM)
(17.1-b03 смешанный режим solaris-sparc) Проблемный кадр: C
[libc.so.1 + 0x33144] strlen + 0x80

Если вы хотите отправить отчет об ошибке, посетите:
http://java.sun.com/webapps/bugreport/crash.jsp Авария произошла
вне виртуальной машины Java в нативном коде. Смотри проблемный
рамка для сообщения об ошибке.

0

Решение

Абсолютно нет

Если вы получаете фатальную ошибку, это потому, что JRE обнаружил ситуацию, когда он считает, что произошло серьезное повреждение структур данных JRE; например куча была повреждена.

Невозможно заставить JRE продолжать работу с потенциально поврежденным состоянием. И это было бы плохой идеей, чтобы попытаться в любом случае.


Вам необходимо найти и исправить проблемы в коде C / C ++, которые вызывают эти сбои. Если это слишком сложно, то:

  • перекодировать нативный код в Java и отказаться от версий C / C ++, или
  • превратить код C / C ++ в автономное приложение и запустить его, используя System.exec() … или что угодно.

(Или, поскольку вы запускаете JVM внутри приложения C / C ++, заставьте его запустить вместо этого отдельную JVM.)

1

Другие решения

Как указал @Stephen C, вы должны попытаться исправить сбои, а не игнорировать их и смотреть в другую сторону.

Но в случае, если сбои выходят за рамки (например, библиотека с ошибками), вы можете переписать ваше приложение, чтобы оно запускалось с Java. Программа на Java не будет делать ничего другого, кроме как вызвать приложение C ++ через JNI, имея вызов C ++ в нативном коде, заключенный в блок try / catch. Если вы ожидаете исключения (например, нарушение доступа к памяти), просто перехватите его и ничего не делайте.

Пример кода можно увидеть в этом SO ответе: https://stackoverflow.com/a/918891/1043352

0

По вопросам рекламы [email protected]