Java 程序确认上次崩溃了吗?

Java 程序确认上次崩溃了吗?,java,error-handling,crash-reports,Java,Error Handling,Crash Reports,让(Java)程序识别上次运行时崩溃的程序并显示一条消息的最佳方式是什么?该消息的大意是“看起来此程序上次在您身上崩溃了。请在此处报告此问题:bla@foo.com……” 有推荐的方法吗?(不好?)我的想法是: 让程序在启动时存储一个临时密钥文件,然后在定期关闭时将其删除。如果文件在启动时存在,则显示消息 在这种情况下,识别死锁并存储“错误文件”。如果启动时存在“错误文件”,请显示错误消息并将文件移动到存档或类似文件中 在未捕获的异常中崩溃?使用,并将消息显示为崩溃的一部分 第一个想法是,如何

让(Java)程序识别上次运行时崩溃的程序并显示一条消息的最佳方式是什么?该消息的大意是“看起来此程序上次在您身上崩溃了。请在此处报告此问题:bla@foo.com……”

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

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

在未捕获的异常中崩溃?使用,并将消息显示为崩溃的一部分

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

认识到死锁-死锁多久会成为问题?我想您可以监视所有“关键”线程上的

然后有外力杀死应用程序,是否应将其视为应报告的问题?毕竟,在这种情况下,你的申请没有错


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

我要做的是将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) {}

Java程序可能崩溃的原因有三个:

  • 未处理的运行时异常。在
    main
    中使用
    try catch
    可以轻松解决此问题
  • 未处理的错误。这些是罕见的,但也可以在
    main
    中找到。我通常在
    main
    中捕获
    Throwable
    。请参见下面的模板
  • 如果使用线程,请查看

  • VM中的错误,或用户杀死的程序,或硬件暴力关闭。这些将导致无法捕捉的碰撞。在这里,最好的选择是使用
    新文件(…).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);
        }
    }
}

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

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

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


它也可能成为一个类似于启动日志文件的文件,用于跟踪程序事件,包括启动和清除停止,可能还有锁定。

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


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

我建议使用适当的日志框架,而不是重定向System.err.或被用户杀死的程序,或硬件暴力关闭等,这些只会捕获“主”线程的问题。如果启动额外线程,那么如果它们抛出运行时异常或错误,消息将丢失。