2009-06-12 7 views
7

Google Chromeをしばらく使用しており、非常にエレガントなクラッシュコントロール機能があることに気付きました。プログラムがクラッシュすると予測する

クラッシュする直前に、Google Chromeで「Woah!Google Chromeがクラッシュしました。再起動しますか?」というメッセージが表示されました。そしてその直後に、私は標準のWindows XPを手に入れました。 "このプログラムには問題があり、終了する必要があります。" 「デバッグ」、「送信しない」、「エラー報告を送信する」ボタンがあります。

私の質問は、事前にクラッシュ条件を検出するためにコンパイルされたアプリケーションをどのようにプログラムできますか?どのようにプログラミング言語/プラットフォームでそれを行う方法の知識を持っている場合は素晴らしいだろう。

おかげ

+6

GoogleがHalting Problemを解決したかどうかは、この質問に一目で分かりました。 –

答えて

16

Google Chromeは「ホスト」UIは子供がそれが(エラーと閉鎖を投げ、またはより悪い)応答しなくなってきて検出することができるプロセスを管理(多くの場合、プロセス分離と呼ばれる)技術を使用しています。開いたタブごとに新しいプロセスが開始されます。

Here's an articleこれについてもう少し詳しく説明します。

.netのProcessクラスを使用すると、プロセスを開始し、プロセスが反応しているかどうかを確認し、それらを終了することもできます。

独自のプロセスウィンドウを埋め込みたい場合は、SetParentなどのプラットフォーム機能を使用して、あるウィンドウを別のウィンドウ内に移動できます。私は、Formsで作業するときにSetParentの管理された代替手段を認識していないことに気付いていますが、SetParentを使用する前にそれを検索する価値があると考えられます。

ホストプロセスがクラッシュした場合、AppDomain.CurrentDomain.UnhandledExceptionのようなものを使用すると、トップレベルの例外が発生したという通知を受け取ることができますが、この段階では、オブジェクト内のオブジェクトの状態を予測することはできませんappと再起動(いくつかのロギングとユーザへの通知と一緒に)おそらくあなたの賢明な選択肢です。

トップレベルの例外の処理は、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

Nice - 誰かが質問に答えたときに、いつもいくつかのコードサンプルを見るのが好きです。 –

+0

それ以上のことをする必要があります。http://www.danielmoth.com/Blog/2004/08/global-exception-handling-net-v11-part.html – mhenry1384

12

私は推測しているので、私はGoogleのコードを知らないのです。おそらくGoogle Chromeはクラッシュすると予測しているのではなく、クラッシュしたことを検出している可能性があります。

Windowsでは、すべての未処理例外のハンドラを提供することでこれを行うことができます。このハンドラでは、アプリケーションの再起動、ミニダンプファイルの作成などを行うことができます。

1つの方法についてはSetUnhandledExceptionFilter Functionを参照してください。

+3

Windowsのデバッグウィンドウが表示される理由その後、googleが先に進んで、それが完了した後にOSにエラーがスローされます。 – NotMe

+0

並べ替え子プロセスの1つがクラッシュしたことを検出しています。 –

3

再起動APIがあります。 Daniel Moth has blogged about it hereおよびhere。私はこれがGoogle Chromeの仕組みではないことに注意してください。ちょうどあなたが調べたいかもしれないものです。

私は、あなたも別のApp Domainsでアプリのビットを読み込むことができると信じています。私はこれが.NET 3.5 Addin framework usesのものだと信じていますが、私はそれを使ったことは言えません。ダニエルはblogged about this tooを持っているように見えます。

関連する問題