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。