14

System.Diagnostics.Process で外部プロセスを起動しています。これはバッチ ジョブの一部であるため、1 つのプロセスがクラッシュした場合は、それを処理して残りを続行させたいと考えています。

現在起こっていることは、プログラムがクラッシュしたことを知らせるダイアログが Windows によってポップアップ表示され、それを手動で閉じるとプロセスが終了するということです。

この質問によると、Process.Responding プロパティは、UI を備えたプログラムでのみ使用できます (起動しているプロセスはコンソール アプリです)。

プロセスが提供するさまざまなイベントも調べましたが、クラッシュ時に発生するイベントはありません。

何か案は?

4

2 に答える 2

25

次のレジストリ値を値 DWORD 2 に設定してみてください。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2

これは、マシン上のすべてのプロセスに影響します。

参照: システムおよびアプリケーションのポップアップ メッセージを削除する方法

クラッシュするプログラムのソース コードがある場合は、すべての構造化された例外をキャッチし、メッセージ ボックスをポップアップせずに終了することで、ポップアップを防ぐことができます。これを行う方法は、使用するプログラミング言語によって異なります。

ソースがない場合は、親で SetErrorMode 関数を使用してポップアップを抑制します。エラーモードはサブプロセスに継承されます。これを機能させるには、UseShellExecute を false に設定する必要があります。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace SubProcessPopupError
{

    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int SetErrorMode(int wMode);

        static void Main(string[] args)
        {
            int oldMode = SetErrorMode(3);
            Process p;
            ProcessStartInfo ps = new ProcessStartInfo("crash.exe");
            ps.UseShellExecute = false;
            p = Process.Start(ps);
            SetErrorMode(oldMode);
            p.WaitForExit();
        }
    }
}

「選択したデバッガーを使用してデバッグしますか?」というダイアログが表示された場合は、このレジストリ値を 0 に設定することで無効にすることができます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0

ただし、上記のようにエラーモードを 3 に設定している場合は、これは発生しないと思います。

于 2009-03-23T13:03:01.803 に答える
0

もう 1 つのオプションは、実行可能ファイルをcdbの下で実行し、次のコマンド ラインを使用して「exception」という単語を検索することです。

cdb.exe -G -g -c "Q" <your executable>
于 2011-07-29T13:24:58.857 に答える