6

让(Java)程序在上次运行时识别它崩溃并显示类似“看起来这个程序上次在你身上崩溃的消息”的最佳方法是什么。在此处报告此问题:bla@foo.com。 ……”

有推荐的方法吗?(坏的?)我的想法是:

  • 让程序在启动时存储一个临时密钥文件,然后在定期关闭时将其删除。如果文件在启动时存在,则显示消息。
  • 在这种情况下识别死锁并存储“错误文件”。如果启动时存在“错误文件”,请显示错误消息并将文件移动到存档或类似文件中。
4

6 回答 6

7

Java程序崩溃的三个原因:

  • 未处理的 RuntimeException。这很容易用try-catchin解决main
  • 未处理的错误。这些是罕见的,但也可以被捕获main。我通常会赶上Throwablemain请参阅下面的模板。
  • 如果您使用线程,请查看Thread.setDefaultUncaughtExceptionHandler().
  • VM中的Bug,或者程序被用户杀死,或者硬件暴力关闭。这些将导致无法捕获的崩溃。在这里,您最好的选择是在某处创建一个带有new File(...).deleteOnExit(). 如果有机会,Java 会为您清理它。

死锁的问题是如何检测你有死锁。我还没有看到一致的方法来做到这一点。

import org.apache.commons.lang.exception.ExceptionUtils;

public class Demo
{
    public static void main (String[] args)
    {
        try
        {
            Demo obj = new Demo ();
            obj.run (args);
            System.out.println ("Done.");
        }
        catch (Throwable t)
        {
            ExceptionUtils.printRootCauseStackTrace (t);
        }
    }
}
于 2009-11-17T13:26:33.227 回答
3

像未捕获的异常一样崩溃?使用Thread.setDefaultUncaughtExceptionHandler并将消息显示为崩溃的一部分。

第一个想法是,您如何处理同时运行的应用程序的多个实例?(还要考虑多用户环境)。

识别死锁 - 死锁多久出现一次问题?我想您可以监视所有“关键”线程上的线程状态。

然后,您有外部力量杀死了应用程序,它们是否应该被视为您应该报告的问题?毕竟,在这种情况下,您的应用程序没有错。

最后,始终以日志的形式存储“错误文件”。使用适当的日志框架(即Java LoggingLog4J)。您可以检查最后几行以获取应用程序正常退出的信号,但在多实例环境中您需要小心。

于 2009-11-17T13:23:33.420 回答
2

您提出的第一个解决方案的一个变体在 Un*x 上对于进程来说很常见:在启动时将正在运行的进程的 pid 文件存储在一个文件中。当程序再次启动时,您可以检查此文件是否仍然存在(即使具有此 pid 的进程正在运行)。

使用 Java,您可能可以使用 ThreadMXBean 中定义的 Threadid 来适应这个想法。但是任何文件都可以。包含您建议的密钥的文件似乎是一种足够好的方法。您还可以在其中放入一些有用的信息,例如上次执行时间。如果它在启动时仍然存在,则程序没有完全停止。

它也可以变成类似启动日志文件的东西,跟踪程序事件,包括启动和干净停止,可能还有锁定。

于 2009-11-17T13:27:49.293 回答
0

我所做的是将 System.err 重定向到一个文件,以便任何错误消息(如崩溃)最终出现在我以后可以处理的文件中......

执行此操作的代码非常简单......

String errLog = "c:\\myLog";
try 
{
  java.io.PrintStream err = new java.io.PrintStream(new java.io.FileOutputStream(errLog));
  System.setErr(err);
}
catch (java.io.FileNotFoundException fnfe) {}
于 2009-11-17T13:25:57.237 回答
0

我要在这里模仿马科斯。创建一个配置或日志文件,该文件将承载程序的最后一条错误消息和最后运行日期。然后在程序加载期间读取该文件。

于 2009-11-17T13:27:36.970 回答
0

其中许多答案都是关于跟踪导致您的应用程序停止工作的异常。

另一种可能性是应用程序刚刚退出(即用户杀死它、计算机关闭、断电等)。我认为你的临时关键想法会为此工作。它类似于文本编辑程序(例如 vi 或 Word)如何自动创建正在编辑的文件的特殊副本。打开后,它会检查特殊副本是否存在并询问您是否要恢复文件。

于 2009-11-17T16:51:18.197 回答