2009-06-12 13 views
7

Utilizzo Google Chrome da un po 'di tempo e ho notato che è dotato di un sistema di controllo degli arresti molto elegante.Prevedendo che il programma si bloccherà

Poco prima di arrestarsi, google chrome ha visualizzato un messaggio che diceva "Woah! Google Chrome si è bloccato. Riavvia ora?". E subito dopo, otterrei un Windows XP standard "Questo programma ha riscontrato un problema e deve essere chiuso." con i pulsanti "Debug", "Do not send" e "Send Error Report".

La mia domanda è come è possibile programmare l'applicazione compilata per rilevare in anticipo una condizione di arresto anomalo? Se hai conoscenza di come farlo in qualsiasi linguaggio di programmazione/piattaforma sarebbe fantastico.

Grazie

+6

A prima vista questa domanda, mi chiedevo se questo avrebbe riguardato se Google avesse risolto il problema dell'arresto ... –

risposta

16

Google Chrome utilizza una tecnica (spesso chiamato processo di separazione), dove l'interfaccia utente 'host' gestisce bambino processi che si può rilevare diventare non risponde (o peggio, gettando un errore e di chiusura). Inizia una nuova procedura per ogni scheda aperta.

Here's an article descrivendo questo un po 'più in dettaglio.

Utilizzando la classe .net Process, è possibile avviare i processi, controllare se sono reattivi e persino eliminarli.

Se si desidera incorporare una finestra di processo all'interno della propria, è possibile utilizzare le funzioni della piattaforma come SetParent per spostare una finestra all'interno di un'altra. Temo di non essere a conoscenza di un'alternativa gestita a SetParent quando lavoro con Forms, ma sospetto che ne esista uno, quindi vale la pena cercarlo prima di utilizzare SetParent.

Se si blocca il processo host, semplicemente usando qualcosa come AppDomain.CurrentDomain.UnhandledException vi permetterà di ricevere una notifica che si è verificata un'eccezione di alto livello, ma a questo punto è improbabile che essere in grado di predire lo stato degli oggetti all'interno del vostro l'app e il riavvio (insieme ad alcuni logging e una notifica all'utente) è probabilmente l'unica opzione sensata.

La gestione delle eccezioni di livello superiore è covered in detail here.

4

In .NET, è possibile collegarsi all'evento System.AppDomain.CurrentDomain.UnhandledException. Il tuo codice sarebbe simile a questo:

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

Bello - Mi piace sempre vedere alcuni esempi di codice quando qualcuno risponde a una domanda. –

+0

È necessario fare altro, vedere http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384

12

Non conosco il codice di Google, quindi sto speculando. Google Chrome probabilmente non prevede che si bloccherà, ma rileverà che si è bloccato.

In Windows è possibile eseguire questa operazione fornendo un gestore per tutte le eccezioni non gestite. In questo gestore potresti fare cose come riavviare l'applicazione, creare un file minidump, ecc.

Dai un'occhiata a SetUnhandledExceptionFilter Function per un metodo.

+3

Si noti che viene visualizzata la finestra di debug di Windows in seguito, Google going avanti e getta l'errore al sistema operativo dopo averlo fatto. – NotMe

+0

Sort of. Rileva che uno dei suoi processi figlio si è bloccato. –

3

C'è un'API di riavvio. Daniel Moth has blogged about it here e here. Si prega di notare che non sto dicendo che questo è il modo in cui Google Chrome funziona, solo che è qualcosa che si potrebbe voler esaminare.

Credo che potresti anche caricare i bit dell'app in App Domains separato. Credo che questo sia ciò che .NET 3.5 Addin framework uses, anche se non posso dire di averlo mai usato (basta leggere a riguardo). Sembra che Daniel abbia blogged about this too.

Problemi correlati