46

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

4

4 回答 4

72

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

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

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

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

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

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

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

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

要使用 Visual Studio,您只需像打开项目一样打开转储文件。打开后,“运行”转储文件(F5默认情况下),如果所有路径都设置正确,它将带您直接找到崩溃的代码,为您提供调用堆栈等。

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

  1. 启动 WinDbg
  2. 打开转储文件。( Ctrl+D默认情况下)
  3. 告诉 WinDbg 去获取正确的 MicroSoft 符号文件。键入.symfix。这可能需要一些时间,因为它会从 Internet 上下载大量内容。
  4. 告诉 WinDbg 符号(PDB 文件)在哪里。键入.sympath+ c:\pdblocation,用放置 PDB 文件的位置替换路径名。确保你在那里得到了加号,.sympath+符号之间没有空格,否则你会搞砸第 3 步。
  5. 告诉 WinDbg 源代码在哪里。键入.srcpath c:\app_build_1.0.100替换您从源代码控制获取此版本软件的代码的路径。
  6. 告诉 WinDbg 分析转储文件。类型!analyze -v

片刻之后,如果一切配置正确,WinDbg 会直接将您带到崩溃的位置。在这一点上,你有一百万个选项可以深入挖掘应用程序的内存空间、关键部分的状态、窗口等。但这超出本文的范围。

祝你好运!

于 2009-04-17T03:05:43.620 回答
40

(请参阅下面的“转储”部分)

使用WinDbg的基础教程和演示

“启动”/附加 WinDBG 的不同方式

工作区

了解工作区的工作原理...

命令树

“cmdtree”允许您定义调试器命令的“菜单”,以便轻松访问常用命令,而无需记住简洁的命令名称。

您不必将所有命令定义放入同一个 cmdtree 文本文件中......如果您愿意,您可以将它们分开并加载多个(然后它们会获得自己的窗口)。

启动脚本

您可以在命令行中使用 -c 选项在启动 WinDBG 时自动运行 WinDBG 脚本。

提供了打开 DML(调试器标记语言)模式、加载特定扩展、设置 .NET 异常断点、设置内核标志的机会(例如,在内核调试时,您可能需要更改 DbgPrint 掩码,以便查看跟踪信息......ed nt !Kd_DEFAULT_Mask 0xffffffff),加载 cmdtrees 等。

一个示例脚本:

$$ Include a directory to search for extensions
$$ (point to a source controlled or UNC common directory so that all developers get access)
.extpath+"c:\svn\DevTools\WinDBG\Extensions"
$$ When debugging a driver written with the Windows Driver Framework/KMDF
$$ load this extension that comes from the WinDDK.
!load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
!wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
$$ load some extensions
.load msec.dll
.load byakugan.dll
.load odbgext.dll
.load sosex
.load psscor4
$$ Make commands that support DML (Debugger Markup Language) use it
.prefer_dml 1
.dml_start
$$ Show NTSTATUS codes in hex by default
.enable_long_status 1
$$ Set default extension
.setdll psscor4
$$ Show all loaded extensions
.chain /D
$$ Load some command trees
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
$$ Show some help for the extensions
!wdfkd.help
!psscor4.help
.help /D

命令备忘单

扩展

“扩展”允许您扩展 WinDBG 中支持的命令/功能范围。

编写你自己的扩展

使用 WinDBG 调试托管代码

脚本(C#、PS、Python、WinDBG)

使用 dbgeng.dll API/WinDBG 工具的调试器/工具

为事后分析生成故障转储文件的不同方法

转储分析工具

转储相关工具

  • Citrix dumpcheck - 检查转储文件的一致性(看起来它已被放弃链接+链接
  • dumpchk(调试工具的一部分) - 检查转储文件的一致性
  • MoonSols Windows Memory Toolkit(以前称为windd) - 将各种原始内存转储文件转换为 WinDBG 兼容的 dmp 文件
  • vm2dmp - Microsoft Hyper-V VM 状态到内存转储转换器
  • vmss2core - 将 VMWare 快照文件转换为核心转储文件(下载),(说明

内核调试虚拟机

  • VMKD - 虚拟机 KD 扩展
  • VirtualKD -(对托管在 VMWare/VirtualBox 中的操作系统的内核调试器支持)

视频

博客

一些博客(本机和托管代码调试的混合)。

高级文章和教程资源

替代调试器

其他链接

于 2014-08-09T21:02:21.337 回答
5

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

  1. 第一步是将转储文件加载到 WinDbg 实例中。
  2. 接下来,您需要确保已设置符号。
  3. 最后,您可以运行该命令!analyze -v以对其执行基本分析。您需要为您的代码提供可用的符号信息,以使转储文件有价值。

内存转储、软件跟踪、调试、恶意软件、受害者软件和情报分析门户网站对我来说非常有用。我也很喜欢这本书, Mario Hewardt 和 Daniel Pravat 的Advanced Windows Debugging

于 2009-04-09T16:23:22.210 回答
3

Tess Ferrandez 有一套很棒的基础教程和实验,可以帮助您开始使用 Windbg。我强烈推荐他们。

于 2009-04-11T04:27:31.447 回答