【问题标题】:How to detect an unmanaged app has aborted如何检测非托管应用程序已中止
【发布时间】:2009-06-26 11:44:21
【问题描述】:
我有一个 C# 应用程序,它通过 Process.Start() 调用非托管 C++ 应用程序
在某些机器上,如果这个 C++ 应用程序中止,我会看到即时错误对话框显示
有没有办法从 C# 中检测到 C++ 应用程序出错并重新启动它
(我没有源代码,因此无法修改 C++ 应用程序)
【问题讨论】:
标签:
debugging
dialog
jit
process.start
【解决方案1】:
显示 JIT 调试器对话框是因为 C++ 应用程序以某种方式崩溃。在对话框打开时,进程仍然存在(但已暂停),这意味着 Process 类不会认为它已“退出”,直到 JIT 对话被解除或附加的调试器结束进程。
您可以在遇到问题的机器上禁用 JIT 调试(我认为禁用 Machine Debug Manager 服务可能会禁用 JIT 调试),让应用程序崩溃和死机(因此,报告为“已退出”),或者(我不知道你会怎么做)看看你是否可以让你的主机 C# 应用程序将自己附加为 C++ 应用程序的调试器并接收来自 C++ 的崩溃通知应用程序,终止它,然后根据它终止的信息采取行动。
【解决方案2】:
如果 C++ 是基于控制台的,您可以检查两件事,
退出码,一般为 0 表示正常关闭,否则有问题(但我认为这取决于开发此应用程序所使用的约定)
-
检查标准错误是否为空,所以一切正常
使用(进程 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)
{
}
}