2014-03-07 61 views
1

我在我的应用程序中使用JNI访问DLL。有时,应用程序崩溃,写这个消息到日志文件:处理JVM崩溃

A fatal error has been detected by the Java Runtime Environment. 

我试图解决这个使用Runtime.getRuntime().addShutdownHook(jvmShutdownHook); ,但没有奏效。

任何人都可以帮我吗?

+0

您可以请发布更多的细节,如完整的错误日志。 –

+0

你使用的是什么DLL? – maxdev

回答

0

可能有助于放置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)

0

你是否自己编写了DLL?那么你最有可能定义了一个带有错误签名的本地函数,或者你使用的JNI函数是错误的。看看Java Native Interface文档。添加您的可疑代码片段以获得更多支持。

如果您使用的是第三方库,则无法简单地使用捕获错误,因为导致VM崩溃的本机错误在大多数情况下无法解析为JVM。