c++ - 如何使用 WinDbg 分析 VC++ 应用程序的故障转储?

标签 c++ visual-c++ windbg crash-dumps

我如何使用 WinDbg用于分析转储文件?

最佳答案

以下是一些可助您顺利进行的一般步骤:

首先,您必须更改编译器的设置,以便它创建 PDB 文件,即使对于发布版本也是如此。 Visual C++ 的更高版本编译器默认执行此操作,但在许多版本的 Visual C++ 中,您必须自己执行此操作。创建程序数据库文件,然后在每次构建应用程序时保存这些文件的存档。应用程序的每个构建都有自己的一组 PDB,这一点至关重要。例如,您不能仅重用与构建 10 相同的那些来检查构建 15 生成的转储。在项目的整个生命周期中,您最终会得到大量 PDB,因此请为此做好准备。

接下来,您需要能够识别生成转储文件的应用程序的确切版本。如果您正在创建自己的 MiniDump(例如通过调用 MiniDumpWriteDump()),可能最简单的方法是简单地将 MiniDump 的文件名的一部分作为应用程序的完整版本号。您需要有一个合理的版本编号方案才能使其工作。在我的商店中,每次自动构建器创建构建时,我们都会将所有分支的构建号加一。

现在您已经从客户那里收到转储文件,您知道创建转储的应用程序的准确版本,并且您已经找到了此构建的 PDB 文件。

现在,您需要查看源代码管理的历史记录并找到该软件的确切版本的源代码。最好的方法是在每次构建时将“标签”应用于分支。将标签的值设置为确切的版本号,在历史记录中就变得容易了。

您几乎已准备好启动 WinDbg/Visual C++:

  • 获取该版本应用程序的完整源代码树。把它放在你硬盘上的一个单独的地方,比如 c:\app_build_1.0.100对于应用程序版本 1.0 build #100。
  • 获取该应用程序的确切版本的二进制文件,并将它们放在硬盘驱动器上的某个位置。简单地安装该版本的应用程序以获取二进制文件可能是最简单的。
  • 将 PDB 文件放在与步骤 2 中的二进制文件相同的位置。

  • 现在您有两种查看转储文件的选项。您可以使用 Visual Studio或 WinDbg。使用 Visual Studio 更容易,但 WinDbg 更强大。大多数情况下,Visual Studio 中的功能就足够了。

    要使用 Visual Studio,您所要做的就是像打开项目一样打开转储文件。打开后,“运行”转储文件(默认为 F5),如果所有路径都设置正确,它会将您带到崩溃的代码,给您一个调用堆栈等。

    要使用 WinDbg,您必须跳过几个环节:
  • 启动 WinDbg
  • 打开转储文件。 (默认 Ctrl + D)
  • 告诉 WinDbg 去获取正确的 MicroSoft 符号文件。类型 .symfix .这可能需要一些时间,因为它会从 Internet 上下载大量内容。
  • 告诉 WinDbg 符号(PDB 文件)在哪里。类型 .sympath+ c:\pdblocation ,用您放置 PDB 文件的任何位置替换路径名。确保您在那里得到加号,.sympath 之间没有空格。和 +签名,否则你会搞砸第 3 步。
  • 告诉 WinDbg 源代码在哪里。类型 .srcpath c:\app_build_1.0.100用您从源代码管理中获取代码的路径替换此版本的软件。
  • 告诉 WinDbg 分析转储文件。类型 !analyze -v

  • 片刻之后,如果一切配置正确,WinDbg 将带您到崩溃的位置。在这一点上,您有 100 万个选项可以深入挖掘应用程序的内存空间、临界区的状态、窗口等。但这远远超出了本文的范围。

    祝你好运!

    关于c++ - 如何使用 WinDbg 分析 VC++ 应用程序的故障转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734272/

    相关文章:

    windbg - 转储文件 + PDB 文件 - 是否可以在一台 PC 上创建转储然后在另一台 PC 上进行调查?

    windbg - 如何在windbg中设置不会停止执行程序的断点,只需记录称为

    c++ - 面向 Delphi 开发人员的 Qt

    c++ - Visual C++ TODO 任务列表不显示元素

    c++ - snprintf : Same code - different errors/warnings on different g++ compilers

    c++ - Visual Studio 2013 是否提供了对 c++11 的 high_performance_clock 的改进?

    c++ - VC++ 2015 没有链接,但 VC++ 2012 有

    windows - 追踪在 Windbg 中创建对象的堆栈跟踪

    c++ - 动态多态性未在 C++ 中正确实现

    c++ - 删除指针数组——我做对了吗?