Прогнозирование сбоя программы

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

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

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

Спасибо


person Wadih M.    schedule 12.06.2009    source источник
comment
При первом взгляде на этот вопрос я задался вопросом, будет ли речь о том, решил ли Google проблему остановки...   -  person J. Polfer    schedule 13.06.2009


Ответы (4)


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

Вот статья с кратким описанием этого более детально.

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

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

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

Обработка исключений верхнего уровня: подробно описано здесь.

person Matt Brindley    schedule 12.06.2009

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

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

Взгляните на Функция SetUnhandledExceptionFilter для одного метода .

person John Dibling    schedule 12.06.2009
comment
Обратите внимание, что причина, по которой окно отладки Windows появляется позже, заключается в том, что Google продолжает и выдает ошибку в ОС после того, как с ней покончено. - person NotMe; 13.06.2009
comment
Вроде. Он обнаруживает, что один из его дочерних процессов потерпел крах. - person i_am_jorf; 13.06.2009

В .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!");
    }
}
person skb    schedule 12.06.2009
comment
Хорошо - мне всегда нравится видеть примеры кода, когда кто-то отвечает на вопрос. - person Ogre Psalm33; 11.11.2009
comment
Вам нужно сделать больше, см. danielmoth.com/Blog/2004/08/ - person mhenry1384; 18.12.2009