预测程序会崩溃

时间:2009-06-12 20:19:32

标签: c# c++ crash

我已经使用谷歌浏览器一段时间了,我发现它具有非常优雅的崩溃控制功能。

就在崩溃之前,谷歌浏览器发出了一条消息“ Woah!Google Chrome已崩溃。现在重启?”。紧接着,我会得到一个标准的Windows XP“这个程序遇到了问题,需要关闭。”使用“调试”,“不发送”和“发送错误报告”按钮。

我的问题是如何编译已编译的应用程序以提前检测崩溃情况?如果你知道如何在任何编程语言/平台上做到这一点会很棒。

由于

4 个答案:

答案 0 :(得分:16)

Google Chrome使用一种技术(通常称为进程分离),其中“主机”用户界面管理可检测到的无法响应的子进程(或者更糟糕的是,抛出错误并关闭)。它会为您打开的每个选项卡启动一个新流程。

Here's an article更详细地描述了这一点。

使用.net的Process类,您可以启动进程,检查它们是否有响应,甚至可以杀死它们。

如果您想在自己的窗口中嵌入一个进程窗口,可以使用SetParent等平台功能在另一个窗口中移动一个窗口。在使用Forms时,我担心我不知道SetParent的托管替代方案,但我怀疑存在一个,所以在使用SetParent之前值得搜索。

如果主机进程崩溃,只需使用AppDomain.CurrentDomain.UnhandledException这样的内容就可以让您收到发生顶级异常的通知,但是在此阶段您不太可能预测到您的应用中的对象并重新启动(以及一些日志记录和对用户的通知)可能是您唯一明智的选择。

处理顶级例外是covered in detail here

答案 1 :(得分:12)

我不知道谷歌的代码,所以我猜测。谷歌浏览器可能不会预测它会崩溃,但会发现它已经崩溃了。

在Windows中,您可以通过为所有未处理的异常提供处理程序来完成此操作。在此处理程序中,您可能会执行诸如重新启动应用程序,创建minidump文件等操作。

请查看SetUnhandledExceptionFilter Function一种方法。

答案 2 :(得分:4)

在.NET中,您可以连接到System.AppDomain.CurrentDomain.UnhandledException事件。您的代码看起来像这样:

using System;
using System.Windows.Forms;

public class Program
{
    public static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += MyUnhandledExceptionHandler;

        // start rest of application
    }

    private static void MyUnhandledExceptionHandler(object sender, EventArgs args)
    {
        MessageBox.Show("Your app is crashing.  Watch out!");
    }
}

答案 3 :(得分:3)

有一个重启API。 Daniel Moth has blogged about it herehere。请注意,我并不是说这是Google Chrome的工作方式,只是您可能想要查看它。

我相信你也可以单独App Domains加载应用程序的部分内容。我相信这就是.NET 3.5 Addin framework uses,虽然我不能说我曾经使用它(只是阅读它)。 Daniel看起来像blogged about this too