Прогнозирование сбоя программы - PullRequest
7 голосов
/ 13 июня 2009

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

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

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

Спасибо

Ответы [ 4 ]

16 голосов
/ 13 июня 2009

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

Вот статья , которая более подробно описывает это.

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

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

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

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

12 голосов
/ 13 июня 2009

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

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

Взгляните на SetUnhandledExceptionFilter Function для одного метода.

4 голосов
/ 13 июня 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!");
    }
}
3 голосов
/ 13 июня 2009

Есть перезапуск API. Даниэль Мот написал об этом здесь и здесь . Обратите внимание, что я не говорю, что так работает Google Chrome, просто вам стоит взглянуть на это.

Я полагаю, вы также можете загрузить биты приложения в отдельных доменах приложений . Я считаю, что это то, что .NET 3.5 Addin Framework использует , хотя я не могу сказать, что когда-либо использовал его (просто прочитал об этом). Похоже, Даниэль тоже написал об этом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...