检测.NET中的进程崩溃

时间:2010-02-22 09:11:52

标签: c# windows

有没有办法确定我的程序启动的进程已崩溃? 目前,我找到的解决方案是查看Process.ExitCode并检查值:

        this.STProcess = Process.Start(this.CreateProcessStartInfo());
        this.STProcess.WaitForExit();
        if (STProcess.ExitCode != 0)
        {
            //raise error event...
        }

我想知道是否有更优雅(和准确)的方法吗?

我更喜欢C#中的答案,并且使用P / Invoke也很好。

P.S - 我需要在Windows XP / Vista / 7上工作

3 个答案:

答案 0 :(得分:5)

没有

除非你能以某种方式影响进程(将错误写入Eventlog?文件),否则就我所知,你没有外部方法知道进程崩溃了。 对你而言,这只是一个消失的过程。甚至Windows都不会将这些信息保存在我所知道的任何地方。它不再存在,除非过程以某种方式保留细节,否则它们就消失了。

答案 1 :(得分:2)

对于Windows 7,有Application Restart and Recovery API。对于.NET,您可以使用Windows API Code Pack

通常,您可以定期搜索进程存在(看门狗应用程序)。

答案 2 :(得分:2)

当进程崩溃时,Windows首先检查您的系统上是否配置了实时调试程序。如果是这样,您可以让该调试器在崩溃之前将其自身附加到进程。通常,您将使用此功能在进程崩溃时生成内存转储。无论您附加什么调试器,都可以了解崩溃过程的PID和名称。您既可以利用现有调试工具的功能(如ADPlus),也可以编写自己的程序,并告诉Windows这是您的实时调试程序,应该在进程崩溃时运行。我相信你可以专门为任何进程名称设置一个JIT调试器。

请参阅http://msdn.microsoft.com/en-us/library/5hs4b7a6(v=VS.80).aspx

我认为如果您将HKLM \ Software \ Microsoft \ Windows NT \ Current Version \ AeDebug \ Debugger注册表项设置为'“DirectoryOfYourProgram \ YourProgram.exe”-p%ld',其中YourProgram.exe需要传入PID使用-p标志,当进程崩溃时,将调用您的程序并传递正确的PID。