2010-02-22 63 views
5

有没有办法确定我的程序启动的进程崩溃了? 目前,我找到了解决办法是看Process.ExitCode和检查值:在.NET中检测进程崩溃

 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的

+1

看到这些其他帖子:http://stackoverflow.com/questions/2279181/catch-another-process-unhandled-exception 和 http://stackoverflow.com/questions/673036/how-to-handle- a-crash-in-a-process-launch-via-system-diagnostics-process – jmservera 2010-02-22 09:41:24

回答

5

除非你能以某种方式影响过程(写入错误的事件日志?一个文件)你有没有外部办法知道一个进程崩溃,因为据我所知。 对你而言,这只是一个消失的过程。即使Windows也不会在我知道的任何地方保存这些信息。它不再存在,除非该过程以某种方式保留细节,否则它们已经消失。

2

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

一般来说,您可以定期搜索进程存在(看门狗应用程序)。

+0

谢谢,但我需要一个可以在Windows XP上运行的解决方案。除此之外 - 我需要知道一个进程是否已经崩溃,而不是退出。 – Rubinsh 2010-02-22 09:24:58

+0

我说得对,只有当你有权访问崩溃的进程的源代码时才能使用它。 – Monsignor 2013-11-12 12:55:31

2

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

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

我认为,如果你设置的HKLM \ SOFTWARE \微软\的Windows NT \当前版本\的AeDebug \调试器注册表项,以 ' “DirectoryOfYourProgram \ YourProgram.exe” -p%ld的',其中YourProgram .exe需要使用-p标志传入的PID,当程序崩溃时,程序将被调用并传递正确的PID。