如何使用WinDbg分析VC ++应用程序的崩溃转储?

时间:2009-04-09 13:38:23

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

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

3 个答案:

答案 0 :(得分:69)

以下是一些可以帮助您的一般步骤:

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

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

现在您已收到客户的转储文件,您知道创建转储的应用程序的精确版本,并且您已找到此版本的PDB文件。

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

你已经准备好启动WinDbg / Visual C ++了:

  1. 获取该应用程序版本的完整源代码树。将它放在硬盘驱动器的单独位置,例如c:\app_build_1.0.100,用于应用程序版本1.0 build#100。
  2. 获取应用程序的确切版本的二进制文件,并将它们放在硬盘驱动器上的某个位置。简单地安装该应用程序版本以获取二进制文件可能是最简单的。
  3. 将PDB文件放在与步骤2中的二进制文件相同的位置。
  4. 现在您有两个查看转储文件的选项。您可以使用Visual Studio或WinDbg。使用Visual Studio更容易,但WinDbg更强大。大多数情况下,Visual Studio中的功能就足够了。

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

    要使用WinDbg,你必须跳过几个环节:

    1. 启动WinDbg
    2. 打开转储文件。 (默认情况下 Ctrl + D
    3. 告诉WinDbg获取正确的MicroSoft符号文件。输入.symfix。这可能需要一些时间,因为它会从互联网上拉下大量的东西。
    4. 告诉WinDbg符号(PDB文件)在哪里。键入.sympath+ c:\pdblocation,替换将PDB文件放在路径名的任何位置。确保在.sympath+符号之间没有空格的情况下获得加号,否则您将搞砸第3步。
    5. 告诉WinDbg源代码在哪里。键入.srcpath c:\app_build_1.0.100替换您从源代码管理获取代码的路径,以获取此版本的软件。
    6. 告诉WinDbg分析转储文件。输入!analyze -v
    7. 片刻之后,如果一切配置正确,WinDbg会将您带到崩溃的位置。此时,您有一百万个选项可以深入挖掘应用程序的内存空间,关键部分的状态,窗口等。但这超出了本文的范围方式

      祝你好运!

答案 1 :(得分:5)

这是一个非常广泛的问题。

  1. 第一步是将转储文件加载到WinDbg实例中。
  2. 接下来,您需要确保设置符号。
  3. 最后,您可以运行命令!analyze -v以对其执行基本分析。您需要为代码提供符号信息才能使转储文件变得有价值。
  4. 网站 Memory Dump, Software Trace, Debugging, Malware, Victimware and Intelligence Analysis Portal 对我来说非常有用。我也非常喜欢Mario Hewardt和Daniel Pravat的书 Advanced Windows Debugging

答案 2 :(得分:3)

Tess Ferrandez已经a great set of basic tutorials and labs开始使用Windbg。我强烈推荐他们。