Vorhersage, dass das Programm abstürzt

7

Ich benutze Google Chrome schon seit einiger Zeit und habe festgestellt, dass es eine sehr elegante Absturzkontrolle bietet.

Kurz vor dem Absturz hat google chrome die Meldung " Woah! Google Chrome ist abgestürzt. Jetzt neu starten? " angezeigt. Und gleich danach würde ich ein Standard Windows XP bekommen "Dieses Programm hat ein Problem festgestellt und muss geschlossen werden." mit den Schaltflächen "Debug", "Nicht senden" und "Fehlerbericht senden".

Meine Frage ist, wie Sie Ihre kompilierte Anwendung so programmieren können, dass sie einen Absturzzustand im Voraus erkennt? Wenn Sie wissen, wie man es in einer Programmiersprache / Plattform macht, wäre das großartig.

Danke

    
Wadih M. 12.06.2009, 20:19
quelle

4 Antworten

16

Google Chrome verwendet eine Technik (oft als Prozesstrennung bezeichnet), in der die Benutzerschnittstelle "host" untergeordnete Prozesse verwaltet, von denen erkannt wird, dass sie nicht mehr reagieren (oder schlimmer noch: Fehler melden und schließen). Es startet einen neuen Prozess für jede Registerkarte, die Sie öffnen.

Hier ist ein Artikel , der das etwas ausführlicher beschreibt.

Mit der Prozess -Klasse von .net können Sie Prozesse starten und prüfen, ob sie reagieren und töten sie sogar.

Wenn Sie ein Prozessfenster in Ihr eigenes einbetten möchten, können Sie Plattformfunktionen wie SetParent verwenden um ein Fenster in ein anderes zu verschieben. Ich fürchte, mir ist keine verwaltete Alternative zu SetParent bei der Arbeit mit Forms bekannt, aber ich vermute, dass eine existiert, so dass es sich lohnt, danach zu suchen, bevor Sie SetParent verwenden.

Wenn der Host-Prozess abstürzt, können Sie einfach mithilfe von " AppDomain.CurrentDomain.UnhandledException " eine Benachrichtigung erhalten, dass eine Ausnahme der höchsten Ebene aufgetreten ist. In diesem Stadium ist es jedoch unwahrscheinlich, dass Sie den Status von Objekten vorhersagen können Ihre App und Neustarten (zusammen mit einigen Logging und eine Benachrichtigung an den Benutzer) ist wahrscheinlich Ihre einzige sinnvolle Option.

Die Behandlung von Ausnahmen der höchsten Ebene ist abgedeckt hier im Detail .

    
Matthew Brindley 12.06.2009, 20:22
quelle
12

Ich kenne den Code von Google nicht, also spekuliere ich. Google Chrome sagt wahrscheinlich nicht voraus, dass es abstürzen wird, erkennt aber, dass es abgestürzt ist.

In Windows können Sie dies tun, indem Sie einen Handler für alle nicht behandelten Ausnahmen bereitstellen. In diesem Handler können Sie Dinge wie den Neustart der Anwendung, das Erstellen einer Minidump-Datei usw. machen.

Sehen Sie sich die Funktion SetUnhandledExceptionFilter für eine Methode an.

    
John Dibling 12.06.2009 20:25
quelle
4

In .NET können Sie sich mit dem System.AppDomain.CurrentDomain.UnhandledException-Ereignis verbinden. Ihr Code würde etwa so aussehen:

%Vor%     
skb 12.06.2009 20:25
quelle
3

Es gibt eine Neustart-API. Daniel Moth hat hier darüber gebloggt und hier . Bitte beachten Sie, dass dies nicht die Art und Weise ist, in der Google Chrome funktioniert, nur dass Sie sich etwas genauer ansehen möchten.

Ich glaube, Sie könnten auch Teile der App in separaten App Domains laden. Ich glaube, das ist, was das .NET 3.5 Addin-Framework verwendet , obwohl ich kann sag nicht, dass ich es jemals benutzt habe (lies einfach darüber). Sieht so aus, als ob Daniel darüber auch gebloggt hat .

    
RichardOD 12.06.2009 20:42
quelle

Tags und Links