如何确保在崩溃时保存应用程序状态c#

时间:2012-02-17 11:28:13

标签: c# .net destructor crash-dumps application-state

我是c#编程的新手,所以请记住:

我有一个内存数据对象,我需要在我的应用程序崩溃或关闭时保存信息。有没有办法确定性地或可靠地做到这一点?

我一直在寻找析构函数

~MyObjectName(){}

终结者和Dispose(),

但据我所知,这些都不能可靠地实现我的目标吗?

目前我正在使用析构函数,当我关闭程序时它会起作用,但这并不意味着它会在崩溃时起作用,或者总是如此。

我是否也应该关注事件?

3 个答案:

答案 0 :(得分:7)

当进程(任何进程,而不仅仅是.Net进程)终止时,有 100%可靠机制可用于保存数据(或执行其他任何操作)可以使用任务管理器中的“结束进程”选项在任何时候终止进程,当发生这种情况时,进程立即被终止。作为一个更极端的例子,电源线可以从机器后部拉出。

如果该数据对象不是100%必需的,那么一旦该进程被终止,该数据对象就是最新的并保存,那么AppDomain.UnhandledException Event就足够了。

如果绝对100%必要,那么您需要在流程运行时不断保存此信息 - 绝对没有保证您将有机会在以后这样做。这是数据库如何操作,直到某些格式(例如事务日志)将某些记录更改记录到磁盘上才会返回事务。这就是D代表ACID的内容。

答案 1 :(得分:5)

我相信您正在寻找捕获未处理的例外情况?像这样的东西:

static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

  Application.Run(new Form1());
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
  // here you can log the exception ...
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
  // here you can log the exception ...
}
  

此示例显示如何管理尚未执行的所有异常   抓住了try-catch部分(在Windows窗体应用程序中)。

     

UnhandledException事件处理从中抛出的未捕获异常   主UI线程。 ThreadException事件处理未捕获   从非UI线程抛出的异常。

答案 2 :(得分:1)

你可以使用windbg实现这一目标。

  1. 在windbg中的zwterminateprocess方法中保留breakpoint。当您的应用程序退出时,将调用此方法。
  2. 到达断点时,使用!dumpheap -type MyObjectName获取对象的地址
  3. 使用!dumpobject“MyObjectName的地址”来了解对象内的值