【问题标题】:How to Generate Crash Dump Analysis Report in Windows Environment如何在 Windows 环境中生成故障转储分析报告
【发布时间】:2014-07-07 06:20:49
【问题描述】:

我正在向最终用户发送软件。我的软件由 MFC 和 C# 组成。当任何进程崩溃时,我会自动将完整转储写入我的日志文件夹。我想运行另一个进程来嗅探日志文件夹并分析转储(如果有任何 .dmp 文件写入该文件夹)。

我知道在 WinDbg 的帮助下,如果我们拥有所有符号,我们可以手动分析转储文件。 但我想自动化这个过程。 我可以从我的代码中调用 windbg 来分析我的转储吗?

例如int i=1/0 代码中的上述行使代码崩溃。我得到了转储文件。 现在我应该看到一条消息,该特定行导致了问题。

【问题讨论】:

  • 嗯,对于 C#,这很容易——只需处理异常。通常,只要您可以合理处理它(即,当它不损害应用程序的状态时),您就会这样做,但您也可以拥有一个全局未处理的异常处理程序(Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException) .即使没有转储,这通常也足以找到错误。如果您发现自己必须进行自动转储分析,那么您的错误处理代码会很臭,在 .NET 中更是如此。在 localhost 上,您可以在代码中任何未处理的异常上附加调试器。
  • 欢迎使用 Stackoverflow。当我写下答案时,我意识到它不符合 Stackoverflow 规则,因为:a) 它显示的研究工作很少。您可能已经了解了如何启动 WinDbg 并传递命令行参数。 b) 它太宽泛了。有很多方法可以实现你想要的。 c)要么太难回答这个问题(提供你真正需要的东西),要么太容易(严格回答你的问题,这只是一个“是”)。请阅读教程,熟悉 StackOverflow,您将来会从中受益。

标签: windows windbg crash-dumps


【解决方案1】:

您想运行一个监控文件夹的应用程序,请查看FileSystemWatcher class (MSDN)

接下来您要通过调用 WinDbg 来分析转储。您可以使用Process.Start() (MSDN) 启动 WinDbg。您可以使用-z 命令行参数将转储名称传递给WinDbg。此外,您可以传递-c 命令行参数来运行一些命令。使用$<$>$><$$><,您甚至可以运行驻留在另一个文件中的命令。请注意,对于这种方法,您的用户需要安装 WinDbg,并且您需要知道它在文件系统中的位置。您可能无法将 WinDbg 与您的应用程序一起发布,因为这是一个许可问题。总而言之,这不是一个很好的方法。

更好的选择是使用DbgHelp functions (MSDN)直接操作转储文件,不依赖完整的WinDbg包。但是,这可能会导致大量工作,尤其是因为您需要确定它是本机异常(MFC 部分)还是 .NET 异常。在任何情况下,要获得行号,您都需要发送应用程序的 PDB。

更简单的方法是在程序级别捕获异常并输出您需要的任何内容。对于许多情况,这应该足以诊断问题。在代码的最后,我将抛出异常,以便程序实际崩溃,并且您仍然可以生成崩溃转储以备不时之需。

请注意,此代码有点危险,因为 File.WriteAllText() 可能并非在所有情况下都有效,例如在 OutOfMemoryException 的情况下,如果目录不存在或 MFC 部分损坏了您的内存。您可能还需要修改此代码以输出来自 InnerException 属性的信息,以免丢失详细信息。

static void Main(string[] args)
{
    try
    {
        RunMyApp();
    }
    catch (Exception e)
    {
        File.WriteAllText(exceptionLogFilename, 
            "Type: {0}\r\nMessage: {1}\r\nStacktrace:{2}\r\n",
            e.GetType().ToString(),
            e.Message,
            e.StackTrace);
        throw;
    }
}

也许你再想一想:我预计会有多少例外?我不能在调试器中手动分析它吗?我真的需要自动分析吗?如果我进行自动分析,我的工具是否足以处理所有情况?或者我最终会遇到使用调试器的情况吗?

另一个提示:从您的问题描述来看,您似乎已经实现了自己的未处理异常处理程序。我认为这种方法有点过时,因为我们有Windows Error Reporting LocalDumps,它可以将完整转储写入磁盘以供以后分析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多