14

我正在使用 System.Diagnostics.Process 启动一个外部进程。这是批处理作业的一部分,所以如果一个进程崩溃,我想处理它并让其余的继续。

当前发生的情况是 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

另一种选择是在cdb下运行您的可执行文件,然后使用以下命令行搜索单词“exception”:

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