有程序认出它上次崩溃了吗?

时间:2009-11-17 13:13:48

标签: java error-handling crash-reports

让(Java)程序在上次运行时识别崩溃的最佳方法是什么,并显示一条消息“看起来这个程序上次崩溃了。请在这里报告此问题:bla @ foo .com ....“

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

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

6 个答案:

答案 0 :(得分:7)

Java程序崩溃有三个原因:

  • 未处理的RuntimeException。使用try-catch中的main即可轻松解决此问题。
  • 未处理的错误。这些很少见,但也可以在main中找到。我通常会在Throwable中抓住main。请参阅下面的模板。
  • 如果您使用线程,请查看Thread.setDefaultUncaughtExceptionHandler()
  • 虚拟机中的错误,或用户杀死的程序,或硬件暴力关闭。这些将导致无法捕获的崩溃。在这里,您最好的选择是使用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);
        }
    }
}

答案 1 :(得分:3)

在未捕获的异常中崩溃?使用Thread.setDefaultUncaughtExceptionHandler,并在崩溃过程中显示消息。

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

识别死锁 - 死锁的频率是多少?我想你可以监控所有“关键”线程上的thread states

如果他们被视为您应该报告的问题,那么您有外部力量杀死该应用程序?在这种情况下,所有申请都没有错。

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

答案 2 :(得分:2)

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

使用Java,您可以使用ThreadMXBean中定义的Threadid来调整这个想法。但任何文件都可以。一个包含你提出的密钥的文件似乎是一个很好的方法。您也可以像上次执行时间一样在其中放入一些有用的信息。如果它在启动时仍然存在,程序并没有完全停止。

它也可能变成类似于启动日志文件,跟踪程序事件,包括启动和清理停止,也可能锁定。

答案 3 :(得分: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) {}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

其中许多答案都是关于跟踪导致您的应用退出工作的异常。

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