2009-06-12 8 views
7

Я использую Google Chrome некоторое время, и я заметил, что он имеет очень элегантный контроль краш-сигнала.Предсказание, что программа выйдет из строя

Перед тем, как сбой, google chrome дал сообщение «Woah! Google Chrome разбился. Перезапустите сейчас?». И сразу после этого я получил стандартную Windows XP «Эта программа столкнулась с проблемой и должна быть закрыта». с кнопками «Отладка», «Не отправлять» и «Отправить сообщение об ошибке».

Мой вопрос в том, как вы можете запрограммировать свое скомпилированное приложение для обнаружения аварийного состояния заранее? Если у вас есть знания о том, как это сделать на любом языке программирования/платформе, было бы здорово.

Благодаря

+6

На первый взгляд на этот вопрос я задавался вопросом, будет ли это решение о том, решила ли Google проблему с остановкой ... –

ответ

16

Google Chrome использует метод (часто называемый разделение процесса), где «хозяин» UI управляет дочерними процессами, которые он может обнаружить его недоступность (или хуже, бросая ошибку и закрытие). Он запускает новый процесс для каждой открываемой вкладки.

Here's an article, описывая это чуть подробнее.

Используя класс .net's Process, вы можете запускать процессы, проверять, реагируют ли они и даже убивают их.

Если вы хотите встроить окно процесса в свой собственный, вы можете использовать функции платформы, такие как SetParent, чтобы переместить одно окно в другое. Боюсь, я не знаю управляемой альтернативы SetParent при работе с Forms, но я подозреваю, что он существует, поэтому стоит поискать это перед использованием SetParent.

Если процесс хоста падает, просто используя что-то вроде AppDomain.CurrentDomain.UnhandledException, вы получите уведомление о том, что произошло исключение верхнего уровня, но на этом этапе вы вряд ли сможете предсказать состояние объектов в вашем приложение и перезапуск (наряду с некоторыми протоколами и уведомлением пользователя), вероятно, является вашим единственным разумным вариантом.

Обработка исключений верхнего уровня - covered in detail here.

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!"); 
    } 
} 
+0

Ницца - Мне всегда нравятся некоторые примеры кода, когда кто-то отвечает на вопрос. –

+0

Вам нужно сделать больше, см. Http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384

12

Я не знаю кода Google, поэтому я размышляю. Google Chrome, вероятно, не предсказывает, что он потерпит крах, но обнаружил, что он разбился.

В Windows вы можете сделать это, предоставив обработчик для всех необработанных исключений. В этом обработчике вы можете делать такие вещи, как перезапуск приложения, создание файла мини-накопителя и т. Д.

Посмотрите на SetUnhandledExceptionFilter Function для одного метода.

+3

Обратите внимание, что причина, по которой открывается окно отладки Windows после этого google идет вперед и выдает ошибку ОС после того, как это будет сделано с ней. – NotMe

+0

Вид. Он обнаружил, что один из его дочерних процессов разбился. –

3

Существует API перезапуска. Daniel Moth has blogged about it here и here. Обратите внимание, что я не говорю, что Google Chrome работает так, что это то, что вы, возможно, захотите изучить.

Я считаю, вы также можете загружать бит приложения в отдельном App Domains. Я считаю, что это то, что .NET 3.5 Addin framework uses, хотя я не могу сказать, что когда-либо использовал его (просто читал об этом). Похоже, у Даниэля blogged about this too.