【问题标题】:How to detect an unmanaged app has aborted如何检测非托管应用程序已中止
【发布时间】:2009-06-26 11:44:21
【问题描述】:

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

在某些机器上,如果这个 C++ 应用程序中止,我会看到即时错误对话框显示

有没有办法从 C# 中检测到 C++ 应用程序出错并重新启动它

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

【问题讨论】:

  • 应用程序控制台是基于控制台还是有 GUI?

标签: debugging dialog jit process.start


【解决方案1】:

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

您可以在遇到问题的机器上禁用 JIT 调试(我认为禁用 Machine Debug Manager 服务可能会禁用 JIT 调试),让应用程序崩溃和死机(因此,报告为“已退出”),或者(我不知道你会怎么做)看看你是否可以让你的主机 C# 应用程序将自己附加为 C++ 应用程序的调试器并接收来自 C++ 的崩溃通知应用程序,终止它,然后根据它终止的信息采取行动。

【讨论】:

    【解决方案2】:

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

    1. 退出码,一般为 0 表示正常关闭,否则有问题(但我认为这取决于开发此应用程序所使用的约定)

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

      使用(进程 p = 新进程()) {

       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)
       {
       }
      }
      

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2019-05-07
      相关资源
      最近更新 更多