使用转储文件在 Visual Studio 中调试应用程序崩溃和挂起

带有或不带堆的转储文件;创建转储文件;打开转储文件;查找二进制文件、pdb 和转储文件的源文件。

内容

What is a dump file?

Dump files, with or without heaps

Requirements and limitations

Create a dump file

Open a dump file

Find binaries, symbol (.pdb) files, and source files

什么是转储文件?

转储文件是应用程序在采用转储的时间点的快照。 它显示了执行的进程和加载的模块。 如果转储与堆信息一起保存,转储文件将包含该时间点在应用程序的内存中储存的内容的快照。 在 Visual Studio 中打开带堆的转储文件类似于在调试会话中在断点处停止。 尽管你无法继续执行,但在转储发生时可以检查应用程序的堆栈、线程和变量值。

转储文件主要用于调试发生在开发人员无权访问的计算机上的问题。 例如,当无法在你的计算机上重现客户的故障或挂起时,可以从客户的计算机使用转储文件。 测试人员还会创建转储文件来保存故障或挂起数据,以便让测试计算机可用于更多测试。 Visual Studio 调试器可为托管或本机代码保存转储文件。 该调试器可加载由 Visual Studio 创建或由以小型转储格式保存文件的其他程序创建的转储文件。

返回页首 Contents

带有或不带堆的转储文件

你可以创建带有或不带堆信息的转储文件。

  • 带有堆的转储文件包含应用程序的内存的快照。 这包括创建转储时的变量的值。 如果加载与堆一起保存的转储文件,即使未找到应用程序二进制文件,Visual Studio 也可以加载符号。 Visual Studio 还会在转储文件中保存加载的本机模块的二进制文件,这可让调试更加容易。

  • 不带堆的转储文件比带有堆信息的转储文件小得多。 但是,调试器必须加载应用程序二进制文件才能查找符号信息。 该二进制文件必须与创建转储时使用的二进制文件完全匹配。 仅在不带堆数据的转储文件中存储堆栈变量的值。

返回页首 Contents

要求和限制

  • 调试优化过代码的转储文件可能让人困惑。 例如,函数的编译器内联可能产生意外的调用堆栈,而其他优化可能更改变量的生存期。

  • 64 位计算机中的转储文件必须在运行于 64 位计算机中的 Visual Studio 的实例上进行调试。

  • 在 VS 2013 之前的 Visual Studio 版本中,对于在 64 位计算机上运行的 32 位应用,通过某些工具(例如,任务管理器和 64 位 WinDbg)收集的转储无法在 Visual Studio 中打开。 VS 2013 中已经取消了此限制。

  • Visual Studio 可以调试 ARM 设备中的本机应用程序的转储文件。 Visual Studio 还可以调试 ARM 设备中的托管应用的应用转储文件,但仅限于本机调试器中。

  • 若要调试 Visual Studio 2013 中的内核模式转储文件,请下载 Windows 8.1 版的 Windows 调试工具。 请参阅 Visual Studio 中的内核调试

  • Visual Studio 无法调试以较旧转储格式(称为完全用户模式转储)保存的转储文件。 请注意,完全用户模式转储与带有堆的转储不同。

  • 若要用 Visual Studio 中的 SOS.dll(SOS 调试扩展) 进行调试,则必须安装适用于 Windows 的调试工具(作为 Windows 驱动程序工具包 (WDK) 的一部分)。 请参阅 Windows 8.1 预览版:下载工具包、组件和工具

返回页首 Contents

创建转储文件

使用 Visual Studio 创建转储文件:

  • 在 Visual Studio 中调试进程时,你可以在调试器已在异常或断点处停止时保存转储文件。 选择,“将转储另存为”,再选择**“调试”。 在“将转储另存为”对话框的“保存类型”列表中,你可以选择“小型转储”“附带堆信息的小型转储”**(默认)。

  • 启用在 Visual Studio 进行实时调试后,可以将调试器附加到在调试器外部运行的故障进程,然后保存转储文件。 请参见使用 Visual Studio 调试器附加到运行的进程

你还可以使用支持 Windows 小型转储格式的任意程序创建转储文件。 例如,Windows Sysinternals 中的 Procdump 命令行实用工具可以基于触发器或按需创建进程故障转储文件。 有关使用其他工具创建转储文件的其他信息,请参阅本主题中的 Requirements and limitations

返回页首 Contents

打开转储文件

  1. 在 Visual Studio 中,依次选择**“文件”“打开”“文件”**。

  2. 在**“打开文件”对话框中定位并选择转储文件。 它通常具有 .dmp 扩展名。 然后选择“确定”**。

  3. 将显示**“转储文件摘要”**窗口。 在该窗口中,你可以查看转储文件的调试摘要信息、设置符号路径、启动调试以及将摘要信息复制到剪贴板中。

    小型转储摘要页

  4. 若要开始调试,请转到**“操作”部分,然后选择“使用‘仅限本机’进行调试”“使用‘混合模式’进行调试”**。

查找二进制文件、符号 (.pdb) 文件和源文件

若要使用 Visual Studio 的完整功能来调试转储文件,则需要访问以下文件:

  • 为其执行转储的 .exe 文件和转储过程中使用的其他二进制文件(DLL 等)。

    如果要调试带有堆数据的转储,则 Visual Studio 可以处理某些模块缺少二进制文件的情况,但是它必须具有足够多的模块的二进制文件才能生成有效的调用堆栈。 Visual Studio 将本机模块包含在带有堆的转储文件中。

  • .exe 的符号 (.pdb) 文件以及其他二进制文件。

  • 与你相关的模块的源文件。

    可执行文件和 .pdb 文件必须与创建转储时使用的文件的版本和内部版本完全匹配。

    如果你找不到源文件,则可以使用模块的反汇编进行调试。

可执行文件的默认搜索路径

Visual Studio 会自动搜索未包含在转储文件中的可执行文件的位置:

  1. 包含转储文件的目录。

  2. 转储文件中指定的模块的路径。 这是收集转储的计算机上的模块路径。

  3. Visual Studio 的**“工具”>“选项”对话框的“调试”>“选项”>“符号”**页中指定的符号路径。 你可以在此页上添加更多要搜索的位置。

使用“无二进制”/“无符号”/“无源”页

如果 Visual Studio 找不到调试转储中的模块所需要的文件,则会显示相应的页(“未找到二进制文件”“未找到符号”“未找到源”)。 这些页面提供了有关问题原因的详细信息,并提供了可帮助你识别文件的正确位置的操作链接。 请参阅在 Visual Studio 调试器中指定符号 (.pdb) 和源文件.

返回页首 Contents

请参见

概念

在 Visual Studio 进行实时调试

通过使用 IntelliTrace 记录代码执行来调试应用

其他资源

在 Visual Studio 调试器中指定符号 (.pdb) 和源文件