有没有办法确定我的程序启动的进程崩溃了? 目前,我find的解决scheme是查看Process.ExitCode
并检查值:
this.STProcess = Process.Start(this.CreateProcessStartInfo()); this.STProcess.WaitForExit(); if (STProcess.ExitCode != 0) { //raise error event... }
我想知道是否有一个更优雅(和准确)的方式来做到这一点?
我宁愿在C#中的答案,并使用P / Invoke也很好。
PS – 我需要在Windows XP / Vista / 7上工作
没有。
除非你能以某种方式影响进程(把错误写到事件日志文件中),就我所知,你没有外部的方法来知道进程崩溃了。 对你而言,这只是一个过程而已。 即使Windows也不会在任何我知道的地方保存这些信息。 它不再存在,除非这个过程保持细节,否则它们就不存在了。
对于Windows 7,有应用程序重新启动和恢复API 。 对于.NET,您可以使用Windows API代码包 。
一般来说,您可以定期搜索进程存在(看门狗应用程序)。
当进程崩溃时,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。