我在我的应用程序中使用JNI访问DLL。有时,应用程序崩溃,写这个消息到日志文件:处理JVM崩溃
A fatal error has been detected by the Java Runtime Environment.
我试图解决这个使用Runtime.getRuntime().addShutdownHook(jvmShutdownHook);
,但没有奏效。
任何人都可以帮我吗?
我在我的应用程序中使用JNI访问DLL。有时,应用程序崩溃,写这个消息到日志文件:处理JVM崩溃
A fatal error has been detected by the Java Runtime Environment.
我试图解决这个使用Runtime.getRuntime().addShutdownHook(jvmShutdownHook);
,但没有奏效。
任何人都可以帮我吗?
可能有助于放置try-catch可调用并在调用dll的块内打印错误消息。
您是否使用slf4j或log4j之类的记录器?你可以添加你的调用问题和信息关于哪些DLL的代码行?如果它的领地 - 然后将很难帮助,但也许你可以尝试类似于一个已知的公共DLL,以确保它没有任何关于一般环境或使用JNI的方式导致问题。
示例代码:
try{
logger.log("entering code location XXX"); //replace XXX with 1-3 words more meaningful and unique
///do something with JNI
}catch(Throwable e){
logger.warn("Error at XXX " + e, e);
}
确保你做不编译:
-g:无 - 不生成任何调试信息
默认为包括所有调试信息,所以如果您之前没有进行自定义,则无需更改任何内容。不同的工具有不同的指定方式。取决于你的编译和构建方法(批处理,蚂蚁,maven等)
如果使用log4j的XML配置示例,这将打印错误的类名称和行号。日志文件和控制台:
http://jakarta.apache.org/log4j/” 调试= “假”>
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> <param name="Threshold" value="ALL" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="Threshold" value="ALL" /> <param name="File" value="log/tfwCore.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> </layout> </appender> <logger name="com.tf4" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http.wire" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http.headers" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <!-- Context Logging --> <logger name="org.apache.http.impl.client" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> <logger name="org.apache.http" additivity="false" > <level value="ALL" /> <appender-ref ref="consoleAppender"/> <appender-ref ref="fileAppender"/> </logger> </log4j:configuration>
在Apache log4j的更多信息和slf4j站点(或者可以使用Java日志或简单的系统输出printlns)
你是否自己编写了DLL?那么你最有可能定义了一个带有错误签名的本地函数,或者你使用的JNI函数是错误的。看看Java Native Interface文档。添加您的可疑代码片段以获得更多支持。
如果您使用的是第三方库,则无法简单地使用捕获错误,因为导致VM崩溃的本机错误在大多数情况下无法解析为JVM。
您可以请发布更多的细节,如完整的错误日志。 –
你使用的是什么DLL? – maxdev