我已经使用谷歌浏览器一段时间了,我发现它具有非常优雅的崩溃控制功能。
就在崩溃之前,谷歌浏览器发出了一条消息“ Woah!Google Chrome已崩溃。现在重启?”。紧接着,我会得到一个标准的Windows XP“这个程序遇到了问题,需要关闭。”使用“调试”,“不发送”和“发送错误报告”按钮。
我的问题是如何编译已编译的应用程序以提前检测崩溃情况?如果你知道如何在任何编程语言/平台上做到这一点会很棒。
由于
答案 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文件等操作。
答案 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 here和here。请注意,我并不是说这是Google Chrome的工作方式,只是您可能想要查看它。
我相信你也可以单独App Domains加载应用程序的部分内容。我相信这就是.NET 3.5 Addin framework uses,虽然我不能说我曾经使用它(只是阅读它)。 Daniel看起来像blogged about this too。