У меня есть приложение Linux C ++, которое создает JVM и делает вызовы JNI. Я новичок в JNI, и до сих пор я нашел единственный эффективный способ отладки своего приложения во время разработки - методом проб и ошибок. Какие методы можно использовать для отладки печально известной «Java Runtime Environment обнаружила фатальную ошибку» Сбои виртуальной машины Java? Как я узнаю, что проблема в моем коде или в подлинной ошибке JVM?
В общем, очевидная вещь, которую я знаю до сих пор:
- В коде всегда проверяйте значения jobject, class и jmethodID, возвращаемые из вызовов JNI для значений NULL, прежде чем продолжить.
- Вызовите env-> ExceptionCheck (), где это необходимо, чтобы убедиться, что нет ожидающих исключений.
В настоящее время я застрял в проблеме, когда трассировка стека в файле отчета об ошибках менее чем полезна:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00002b137a99db59, pid=19977, tid=47362673452544
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.3-b01 mixed mode linux-amd64 )
# Problematic frame:
# V [libjvm.so+0x40fb59]
... <snip> ...
Stack: [0x00007fff1964f000,0x00007fff1974f000], sp=0x00007fff1974e050, free space=3fc0000000000000018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x40fb59]
V [libjvm.so+0x3ecbe1]
C [libDataFabric.so+0x1bb5b] _Jv_JNIEnv::CallObjectMethod(__jobject*, _jmethodID*, ...)+0xe3
etc. ...
Хорошо, я знаю, что он умирает в env-> CallObjectMethod (). Я проверил все параметры этого в GDB, прежде чем он погрузится в код JVM, но я не вижу никаких явных NULL или странных значений. И, конечно, все классы JNI, такие как jobject, бесполезно непрозрачны, поэтому я не могу видеть, указывают ли их указатели на поддельные или реальные данные.
Какие-нибудь советы / предложения / идеи для такого рода проблемы?