转储文件是一个快照,显示正在执行的进程,以及某个时间点为应用加载的模块。 包含堆信息的转储还包含该应用程序内存的快照。
在 Visual Studio 中打开带堆的转储文件类似于在调试会话中在断点处停止。 虽然无法继续执行,但可以在转储时检查应用的堆栈、线程和变量值。
内存转储主要用于调试开发人员无权访问的机器上的故障。 当你无法在自己的计算机上重现崩溃或无响应的程序时,可以使用来自客户计算机的转储文件。 测试人员还会创建转储来保存崩溃或无响应的程序数据,以用于更多测试。
Visual Studio 调试器可为托管或本机代码保存转储文件。 它可以调试 Visual Studio 创建的转储文件,也可以调试以 小型转储 格式保存文件的其他应用。
要求和限制
- 若要调试来自 64 位计算机的转储文件,Visual Studio 必须在 64 位计算机上运行。
- Visual Studio 可以从 Linux OS 调试托管应用的转储文件。
- Visual Studio 可以调试 ARM 设备中的本机应用程序的转储文件。 它还可以调试 ARM 设备中的托管应用的转储,但仅限于在本机调试器中。
- 若要调试 内核模式 转储文件或使用 Visual Studio 中的 SOS.dll 调试扩展,请下载 Windows 驱动程序工具包(WDK)中的 Windows 调试工具。
- Visual Studio 无法调试以旧版 完全用户模式转储 格式保存的转储文件。 完全用户模式转储与带堆的转储不同。
- 调试优化过代码的转储文件可能让人困惑。 例如,函数的编译器内联可能产生意外的调用堆栈,而其他优化可能更改变量的生存期。
带有或不带堆的转储文件
转储文件不一定具有堆信息。
带堆的转储文件包含转储时的应用内存的快照,其中包括变量的值。 Visual Studio 还会在带堆的转储文件中保存加载的本机模块的二进制文件,这可让调试变得更加容易。 Visual Studio 可以从带堆的转储文件中加载符号,即使找不到应用二进制文件也是如此。
不包含堆的转储文件 比包含堆的转储文件要小得多,但调试器必须加载应用程序的二进制文件才能找到符号信息。 加载的二进制文件必须与转储创建期间运行的二进制文件完全匹配。 不带堆的转储文件仅保存堆栈变量的值。
创建转储文件
在 Visual Studio 中调试进程时,当调试器在异常或断点处停止时,可以保存转储文件(dump文件)。
启用Just-In-Time 调试后,可以将 Visual Studio 调试器附加到 Visual Studio 外部发生崩溃的进程,然后从调试器保存转储文件。 请参阅附加到正在运行的进程。
保存转储文件:
调试期间在错误或断点处停止时,选择调试>将转储另存为。
在“将转储另存为”对话框中的“保存类型”下,选择“小型转储”或“附带堆信息的小型转储”(默认)。
浏览到路径并选择转储文件的名称,然后选择“ 保存”。
注释
可以使用支持 Windows 小型转储格式的任何程序创建转储文件。 例如,Windows Sysinternals 中的 Procdump 命令行实用工具可以根据触发器或按需创建进程故障转储文件。 有关使用其他工具创建转储文件的信息,请参阅 要求和限制 。
打开转储文件
在 Visual Studio 中,选择“ 文件>打开>文件”。
在 “打开文件 ”对话框中,找到并选择转储文件。 它通常具有 .dmp 扩展。 选择“确定”。
“小型转储文件摘要”窗口显示转储文件的摘要和模块信息,以及可以执行的操作。
在 操作下:
- 若要设置符号加载位置,请选择 “设置符号路径”。
- 若要开始调试,请选择仅调试托管内存、调试混合型内存或仅调试本机内存。
- 若要分析托管内存,请选择 “调试托管内存 ”,并查看 托管类型报告。
- 若要在转储上运行内存分析器,请选择 “运行诊断分析 ”,并查看 使用 .NET 诊断分析器调试托管内存转储。
查找 .exe、.pdb 和源文件
若要在转储文件上使用完整的调试功能,Visual Studio 需要:
- 为转储创建的 .exe 文件,以及转储进程使用的其他二进制文件(例如 DLL)。
- “.exe”的符号 (.pdb) 文件以及其他二进制文件。
- 与创建转储时的文件版本和内部版本完全匹配的 .exe 和 .pdb 文件。
- 相关模块的源文件。 如果找不到源文件,则可以使用模块的拆解。
如果转储带有堆数据,则 Visual Studio 可以处理某些模块缺少二进制文件的情况,但是它必须具有足够多的模块的二进制文件才能生成有效的调用堆栈。
.exe 文件的搜索路径
Visual Studio 会自动搜索转储文件中不包含 .exe 文件的位置:
- 包含转储文件的文件夹。
- 转储文件指定的模块路径,它是收集转储的计算机上的模块路径。
- 工具(或调试)>选项>调试>符号中指定的符号路径。 也可以从“转储文件摘要”窗口的“操作”面板打开“符号”页。 在此页上,可以添加更多位置进行搜索。
使用“未找到二进制文件”、“未找到符号”或“未找到源”页
如果 Visual Studio 找不到在转储中调试模块所需的文件,则会显示 “未找到二进制文件”、“ 未找到符号”或 “未找到源” 页。 这些页面提供有关问题原因的详细信息,并提供有助于查找文件的作链接。 请参阅指定符号 (.pdb) 和源文件。