处理JVM崩溃

时间:2014-03-07 09:56:25

标签: java jvm java-native-interface

我在我的应用程序中使用JNI访问DLL。有时应用程序崩溃,将此消息写入日志文件:

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

我尝试使用Runtime.getRuntime().addShutdownHook(jvmShutdownHook);处理此问题 但那没用。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

可能有助于在调用dll的块中放置try-catch Throwable并打印错误消息。

您使用的是像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:none - 不生成调试信息

默认是包含所有调试信息,因此如果您之前没有自定义,则无需更改任何内容。不同的工具有不同的指定方式。取决于您的编译和构建方法(批处理,ant,maven等)

示例XML配置如果使用log4j,则会打印类名和行号错误。记录文件和控制台:

        

  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)

答案 1 :(得分:0)

你自己编写了DLL吗?然后,您最有可能定义了具有错误签名的本机函数,或者您使用的JNI函数错误。请查看Java Native Interface文档。添加可疑的代码段以获得更多支持。

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