提问人:Free Wildebeest 提问时间:9/15/2008 最后编辑:ElijahFree Wildebeest 更新时间:8/19/2009 访问量:4656
如何在 Java 中捕获崩溃日志
How to capture crash logs in Java
问:
我正在开发一个 Java 跨平台应用程序,该应用程序目前在 Windows、Linux 和 MacOS X 上运行良好。我正在尝试找到一种很好的方法来检测(和处理)“崩溃”。有没有一种简单的、跨平台的方法来检测 Java 中的“崩溃”并采取一些措施来做出回应?
我想“崩溃”是指未捕获的异常。但是,代码确实使用了一些 JNI,因此能够从错误的 JNI 代码中捕获崩溃会很好,但我有一种特定于 JVM 的感觉。
答:
为了处理未捕获的异常,您可以提供一个新的 ThreadGroup,它提供 ThreadGroup.uncaughtException(...) 的实现。然后,您可以捕获任何未捕获的异常并适当地处理它们(例如,将崩溃日志发送到家)。
在JNI方面,我无法为您提供帮助,在调用JVM之前,可能有一种方法可以使用本机包装器可执行文件,但是该可执行文件需要知道它可能调用的所有可能的JVM,以及如何指示崩溃以及崩溃日志的放置位置等。
不确定这是否是您需要的,但您也可以从本机代码中检测是否发生了异常。有关详细信息,请参阅 http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234。
评论
对于简单的 catch-all 处理,可以在 Thread 中使用以下静态方法。从 Javadoc:
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且尚未为该线程定义其他处理程序。
这是一种非常广泛的方法来处理错误或未经检查的异常,这些错误或异常可能无法在其他任何地方捕获。
旁注:如果代码能够捕获、记录和/或从更接近问题根源的异常中恢复,那就更好了。我会将这种通用的崩溃处理保留在完全无法恢复的情况(即java.lang.Error的子类)中。尽量避免 RuntimeException 完全未被捕获的可能性,因为软件可能 - 而且更可取 - 幸存下来。
评论