如何检测非托管应用程序已中止

时间:2009-06-26 11:44:22

标签: debugging dialog jit process.start

我有一个C#app,它通过Process.Start()调用非托管C ++应用程序

在某些机器上,如果这个C ++应用程序中止,我将留下Just-In-Time错误对话框显示

是否有一种方法可以让C#检测到C ++应用程序出错并重新启动它

(我没有源代码,因此无法修改C ++应用程序)

2 个答案:

答案 0 :(得分:1)

显示JIT调试器对话框,因为C ++应用程序以某种方式崩溃。当对话框打开时,该过程仍然存在(但是暂停),这意味着在JIT对话被解除或附加的调试器结束该过程之前,Process类不会认为它已“退出”。

你可以在遇到问题的机器上禁用JIT调试(我认为禁用机器调试管理器服务可能会禁用JIT调试),允许应用程序崩溃并死掉(因此,报告为“退出”),或(我不知道你将如何做到这一点)看看你是否可以让你的主机C#app附加自己作为C ++应用程序的调试器并从C ++接收崩溃的通知应用程序,终止它,然后对它已经结束的信息采取行动。

答案 1 :(得分:0)

如果C ++是基于控制台的,你可以检查两件事,

  1. exitcode,通常0表示正常关闭,否则是问题(但我认为这取决于用于开发此应用程序的惯例)

  2. 检查标准错误是否为空,所以一切正常

    使用(Process p = new Process())    {

     p.StartInfo.UseShellExecute = false;
     p.StartInfo.RedirectStandardError = true;
     p.StartInfo.FileName = "any.exe";
     p.Start();
     string error = p.StandardError.ReadToEnd();
     p.WaitForExit()
     if(error.Length == 0 && p.ExitCode == 0)
     {
     }
    }