识别 C# Process.Start() 运行的可执行文件的崩溃

Posted

技术标签:

【中文标题】识别 C# Process.Start() 运行的可执行文件的崩溃【英文标题】:Identify crash of executable run by C# Process.Start() 【发布时间】:2016-12-01 19:32:05 【问题描述】:

我的代码:

ProcessInfo processInfo = ...
Process proc = Process.Start(processInfo);
proc.WaitForExit();
if (proc.ExitCode != 0)

   // ...

我的问题是进程(C++ 可执行文件)有时会在未知情况下由于未处理的异常而崩溃。

我可以说可执行文件崩溃了,因为在崩溃时它返回一个负退出代码(或非零)。但是,我无法创建进程转储来进行调查。

如果我至少弹出了 Windows 的“程序停止工作”消息,那么我可以手动创建转储。

当然,我可以使用像 Debug Diag 这样的软件来监控可执行文件并在崩溃时进行转储,但我宁愿拥有更通用的内部解决方案。

【问题讨论】:

【参考方案1】:

除了 stdOut 之外,您是否尝试过捕获 stdErr 输出?

例如:

Process installProcess = new Process 
 
    StartInfo = 
    
        FileName = exeName,
        Arguments = args,
        CreateNoWindow = true,
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    
;

installProcess.Start();

string processStandardOutput = installProcess.StandardOutput.ReadToEnd();
string processStandardError = installProcess.StandardError.ReadToEnd();

// Check both strings for !IsNullOrEmpty and log something of interest

installProcess.WaitForExit();
ExitCode = installProcess.ExitCode;

// If ExitCode < 0, log the StandardError output...

【讨论】:

【参考方案2】:

我认为这真的取决于被调用的可执行文件来输出错误。它是输出到窗口还是在事件查看器中放置条目等取决于相关应用程序。您应该能够阅读输出消息。

【讨论】:

以上是关于识别 C# Process.Start() 运行的可执行文件的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 Process.Start() 通过快捷方式运行应用程序

C# Process.Start 路径

C# Process Start 需要带双引号的参数 - 它们消失了

Process.Start 无法正确运行批处理文件

Process.Start 打开资源管理器

C# 中的 Process.Start 与 Process `p = new Process()`?