如何在 Java 中捕获崩溃日志

How to capture crash logs in Java

提问人:Free Wildebeest 提问时间:9/15/2008 最后编辑:ElijahFree Wildebeest 更新时间:8/19/2009 访问量:4656

问:

我正在开发一个 Java 跨平台应用程序,该应用程序目前在 Windows、Linux 和 MacOS X 上运行良好。我正在尝试找到一种很好的方法来检测(和处理)“崩溃”。有没有一种简单的、跨平台的方法来检测 Java 中的“崩溃”并采取一些措施来做出回应?

我想“崩溃”是指未捕获的异常。但是,代码确实使用了一些 JNI,因此能够从错误的 JNI 代码中捕获崩溃会很好,但我有一种特定于 JVM 的感觉。

Java 错误处理 崩溃

评论


答:

3赞 Free Wildebeest 9/15/2008 #1

为了处理未捕获的异常,您可以提供一个新的 ThreadGroup,它提供 ThreadGroup.uncaughtException(...) 的实现。然后,您可以捕获任何未捕获的异常并适当地处理它们(例如,将崩溃日志发送到家)。

在JNI方面,我无法为您提供帮助,在调用JVM之前,可能有一种方法可以使用本机包装器可执行文件,但是该可执行文件需要知道它可能调用的所有可能的JVM,以及如何指示崩溃以及崩溃日志的放置位置等。

1赞 Evan 9/15/2008 #2

不确定这是否是您需要的,但您也可以从本机代码中检测是否发生了异常。有关详细信息,请参阅 http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234

评论

0赞 Free Wildebeest 9/15/2008
了解这一点很有用,因为我确实从本机代码中调用 Java 代码,因此它会增加我可以处理意外异常/崩溃的点。看起来我将不得不使用这样的代码通过一些崩溃检查来分散代码。
4赞 David Crow 9/15/2008 #3

对于简单的 catch-all 处理,可以在 Thread 中使用以下静态方法。从 Javadoc:

static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且尚未为该线程定义其他处理程序。

这是一种非常广泛的方法来处理错误或未经检查的异常,这些错误或异常可能无法在其他任何地方捕获。

旁注:如果代码能够捕获、记录和/或从更接近问题根源的异常中恢复,那就更好了。我会将这种通用的崩溃处理保留在完全无法恢复的情况(即java.lang.Error的子类)中。尽量避免 RuntimeException 完全未被捕获的可能性,因为软件可能 - 而且更可取 - 幸存下来。