【问题标题】:How to capture crash logs in Java如何在 Java 中捕获崩溃日志
【发布时间】:2010-09-08 21:00:18
【问题描述】:

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

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

【问题讨论】:

    标签: java error-handling crash


    【解决方案1】:

    对于简单的包罗万象的处理,您可以在Thread 中使用以下静态方法。来自 Javadoc:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 知道这一点很有用,因为我确实从本机代码调用 Java 代码,因此它将增加我可以处理意外异常/崩溃的点。看起来我将不得不使用这样的代码通过一些崩溃检查来分散代码。
      【解决方案3】:

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

      在 JNI 方面我帮不了你,可能有一种方法可以在调用 JVM 之前使用本机包装器可执行文件,但该可执行文件需要了解它可能调用的所有可能的 JVM 以及指示方式崩溃以及崩溃日志的放置位置等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多