如何使用WinDbg分析转储文件?
答案 0 :(得分:69)
以下是一些可以帮助您的一般步骤:
首先,您必须更改编译器的设置,以便创建PDB文件,即使对于发布版本也是如此。更高版本的Visual C++编译器默认执行此操作,但在许多版本的Visual C ++中,您必须自己执行此操作。创建程序数据库文件,然后保存这些文件的存档以及应用程序的每个版本。至关重要的是,应用程序的每个构建都有自己的一组PDB。例如,您不能只重复使用与构建10相同的方法来检查构建15生成的转储。在项目的整个生命周期中,您最终会得到大量的PDB,因此请做好准备。
接下来,您需要能够识别生成转储文件的应用程序的确切版本。如果您正在创建自己的MiniDump(例如,通过调用MiniDumpWriteDump()),可能最简单的方法是将MiniDump的部分文件名作为应用程序的完整版本号。您需要有一个合理的版本编号方案才能实现。在我的商店中,每次autobuilder创建构建时,我们都会将所有分支的构建号增加一个。
现在您已收到客户的转储文件,您知道创建转储的应用程序的精确版本,并且您已找到此版本的PDB文件。
现在您需要查看源代码管理的历史记录,并找到该软件的确切版本的源代码。执行此操作的最佳方法是在每次构建时将“标签”应用于分支。将标签的值设置为确切的版本号,并且在历史记录中很容易找到。
你已经准备好启动WinDbg / Visual C ++了:
c:\app_build_1.0.100
,用于应用程序版本1.0 build#100。现在您有两个查看转储文件的选项。您可以使用Visual Studio或WinDbg。使用Visual Studio更容易,但WinDbg更强大。大多数情况下,Visual Studio中的功能就足够了。
要使用Visual Studio,您所要做的就是打开转储文件,就像它是一个项目一样。打开后,“运行”转储文件(默认情况下为 F5 ),如果所有路径都设置正确,则会直接转到崩溃的代码,给你一个调用堆栈等。
要使用WinDbg,你必须跳过几个环节:
.symfix
。这可能需要一些时间,因为它会从互联网上拉下大量的东西。.sympath+ c:\pdblocation
,替换将PDB文件放在路径名的任何位置。确保在.sympath
和+
符号之间没有空格的情况下获得加号,否则您将搞砸第3步。.srcpath c:\app_build_1.0.100
替换您从源代码管理获取代码的路径,以获取此版本的软件。!analyze -v
片刻之后,如果一切配置正确,WinDbg会将您带到崩溃的位置。此时,您有一百万个选项可以深入挖掘应用程序的内存空间,关键部分的状态,窗口等。但这超出了本文的范围方式。
祝你好运!答案 1 :(得分:5)
这是一个非常广泛的问题。
!analyze -v
以对其执行基本分析。您需要为代码提供符号信息才能使转储文件变得有价值。网站 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。我强烈推荐他们。