3

过去,我听说过使用 WinDbg 解析 .dmp 文件的参考资料(我认为 - 我可能错了)。

在 .map 文件的帮助下,我还进行了相当广泛的调试,并使用标准逻辑启发式和 Visual Studio 调试器进行了广泛的调试。

但是,有时,我正在开发的程序会崩溃并创建一个 .dmp 文件。我一直无法解释 .dmp 文件。前段时间,我发布了一个关于如何解释 .dmp 文件的 SO 问题(如何在 Windows 7 上查看 .dmp 文件?),但经过一番努力后,我无法弄清楚如何使用答案来解释 .dmp 文件那个问题。

今天,我正在查看一个不相关的 SO 问题(C++ try/throw/catch => machine code),并且在已接受答案下方的有用评论再次引用了 WinDbg。

如果你真的想找到它,这很容易 - 只需在 WinDbg 中追踪它

我想听从这个建议。然而,对我来说,“只在 WinDbg 中追踪它”并不容易。我过去曾尝试过,但无法弄清楚这到底意味着什么或该怎么做!

所以,我再试一次。“一劳永逸”,我希望得到关于以下方面的简单明了的说明:

  1. 什么是WinDbg
  2. 假设 WinDbg 与 .dmp 文件有关,转储文件到底是什么以及它与 WinDbg 有什么关系(如果我的假设错误,请纠正我)
  3. 如何创建 .dmp 文件,以及如何使用 WinDbg 分析它们(再次,如果我对 WinDbg 和 .dmp 文件之间的关系有误,请纠正我)。

如果您可以请从仅安装和运行 Visual Studio 的程序员的“起点”回答这个问题。

谢谢!

4

2 回答 2

4
  1. WinDbg 是一个多用途的调试器。它可以像使用任何其他调试器一样通过附加、设置断点等来调试实时进程。它还可以分析故障转储文件,即 .dmp 文件。它通过你给它命令来发挥作用。

  2. .dmp 文件是某事的内存转储。那是什么取决于内存转储的用途。例如,它可以用于一个过程。它也可以用于内核。内存转储中的内容也取决于。在您的情况下,这可能是您的进程在崩溃时的样子。内存转储包含的内容可能因转储类型而异。

  3. 有多种方式。在 Windows Vista+、Server 2008+ 上 - 您可以直接从任务管理器中执行此操作。右键单击该进程,然后单击“创建内存转储”。WinDbg 也可以使用该.dump命令从实时进程中进行内存转储。其他工具(如 adplus)可用于在某些条件下自动创建内存转储,例如当进程超过内存或 CPU 阈值时,或者当它崩溃时。

WinDbg 可以很容易地打开崩溃转储。重要的是您首先要正确加载符号。通常以 .pdb 文件的形式或来自符号服务器的形式(尽管不是必需的,或者总是可能的,但它非常有帮助)。

运行 WinDbg 后,查看可在故障转储中查找的命令列表。

于 2012-11-30T14:26:11.660 回答
2
  1. WinDbg 是命令行调试器 cdb.exe 的 Gui 版本,两者都是用户进程和内核模式调试器,它使用 DbgHelp.dll 向您的应用程序或 NT 内核发出命令(您也可以这样做,因为它有一个 api )。
  2. .dmp 文件是不同细节的内存转储,有些可能只有最少的细节,足以用于所有线程的调用堆栈,而其他文件将放置整个用户模式内存、句柄信息、线程信息、内存信息等。有关更多信息,请参阅. 所以dump文件跟WinDbg没什么关系,除了能打开外,还可以在Visual Studio中打开.dmp文件
  3. 就像@vcsjones 已经说过你可以使用任务管理器来做到这一点(至少你可以从Vista 开始),你可以使用procdump,一旦附加了WinDbg,你就可以做到这一点,我通常会像这样做一个完整的迷你转储:.dump /ma c:\mem.dmp,你可以还使用Dr. Watson将 Windows 设置为在发生崩溃时执行此操作

但是,您必须拥有 Windows 和应用程序的符号才能生成合理的调用堆栈,请注意,由于显而易见的原因,您不能在内存转储中单步执行或设置断点,您只能对实时进程执行此操作。您还可以非侵入式附加 WinDbg,因此可以附加 Visual Studio,您可以非侵入式附加 WinDbg 并使用 WinDbg 中的工具集来协助调试。

对我来说,WinDbg 的主要优点是它免费,下载和安装小,速度快,它有一个非常丰富的工具集,用于诊断使用 Visual Studio 很难或不可能解决的问题。

于 2012-11-30T14:41:16.400 回答