Visual Studio调试器指南---转储文件
转储文件(以前称为故障转储)使您能保存程序信息以供以后进行调试。 在没有源文件或符号文件的计算机上测试程序时,转储文件尤其有用。 发生崩溃时,可以先保存转储文件,以后在生成计算机或另一台具有源文件和调试符号的计算机上对其进行调试。
由 Visual Studio 保存和打开的转储文件使用名为小型转储的文件格式。 Visual Studio 可以保存附带或不附带堆信息的小型转储文件。Visual Studio调试器可以保存适用于托管代码或本机代码的小型转储文件。调试器可以加载由 Visual Studio 或由其他以小型转储格式保存文件的程序所创建的转储文件。
创建转储文件
创建和保存转储文件的方法有以下几种:
-
在 Visual Studio中调试进程时,可以使用“调试”菜单上的“将转储另存为”选项保存转储文件。
-
如果启用了实时调试,则可以附加到在调试器外部运行的故障进程,中断该进程,然后保存转储文件。
-
您可以保存使用 UserDump 实用工具创建的转储文件,该工具是 OEM 支持工具包的一部分。 可以从 Microsoft 网站的以下网页下载包的副本:http://www.microsoft.com/downloads/search.aspx?displaylang=zh-cn。
http://download.microsoft.com/download/win2000srv/Utility/3.0/NT45/EN-US/Oem3sr2.zip
-
您可以保存使用 Autodump+ 实用工具创建的转储文件,该工具是 Microsoft Windows 调试工具的一部分。 可以从 Microsoft 网站的以下网页下载 Windows 调试工具:Windows Hardware Developer Central(Windows 硬件开发中心)。
调试转储
Visual Studio 调试器可以读取包含有关托管代码、非托管代码或二者混合的信息的转储文件。 可以使用普通的调试窗口来同时调试本机转储和托管转储。
转储要求和限制
调试转储文件时,您进行调试的计算机必须能够访问该程序的 PDB 符号文件和二进制文件。 Visual Studio 可以处理某些模块缺少二进制文件的情况,但是必须具有足够的模块以生成有效调用堆栈的二进制。 否则,“模块”窗口中将显示消息“找不到匹配的二进制数”。
对于使用堆保存的小型转储文件,即使未找到应用程序的二进制文件,Visual Studio 也可以加载符号。 小型转储文件,没有需要二进制数以加载符号的堆。 但是,不包含堆的小型转储文件要小得多,如果您有存储或带宽限制,这可以是一个重要的考虑因素。
在 Visual Studio 中,可以使用调试窗口来同时调试本机和托管转储文件。Visual Studio 2008 不支持在调试器窗口中调试托管的代码。 调试托管的小型转储文件需要一个名为 SOS,从“即时”窗口中运行的工具。 在 Visual Studio 中,不再需要 SOS 来调试托管的小型转储文件。
保存和打开转储文件
在 Visual Studio 中,您可以保存来自本机进程或托管进程的转储文件,以便将来再进行调试。 您也可以加载从 Visual Studio 或其他生成转储的实用工具创建的转储文件。
保存转储文件
-
在“调试”菜单上,单击“将转储另存为”。
-
在“将转储另存为”对话框中,从“保存类型”列表中选择“小型转储”或者“附带堆信息的小型转储”。
“附带堆信息的小型转储”是 Visual Studio 使用的默认转储格式。 “小型转储”提供的信息较少,但同时需要的空间也较少。
-
使用导航控件选择保存位置。
-
单击“保存”。
如果正在调试托管代码,则“将转储另存为”会创建一个托管代码小型转储文件。 如果正在调试本机代码,则“将转储另存为”会创建一个本机代码小型转储文件。 如果正在调试混合的托管代码和本机代码,则“将转储另存为”会创建一个托管代码小型转储文件。
打开转储文件
-
在“文件”菜单上,单击“打开”,再单击“文件”。
-
在“打开文件”对话框中定位并选择转储文件。
它通常具有 .dmp 扩展名。
- 或者在“文件”菜单上,单击“打开”,再单击“文件”。
-
单击“确定”。
将显示“转储文件摘要”窗口。 在该窗口中,您可以查看转储文件的调试摘要信息、设置符号路径、启动调试以及将摘要信息复制到剪贴板中。
-
在“操作”部分中,单击“使用‘仅限本机’进行调试”或“使用‘混合模式’进行调试”开始调试。
为了找到调试转储文件时所需的二进制文件,Visual Studio 会在符号搜索路径中进行查找。 为了确保 Visual Studio 能够找到这些二进制文件,您可以在“选项”对话框或“模块”窗口中添加一个符号搜索路径。
转储模块加载
当您在 Visual Studio 中加载转储文件时,调试器从转储文件所在位置开始查找模块。假设在您创建转储文件时加载了以下二进制文件和模块:
D:\qa\exmpl\exmpl.exe
D:\qa\exmpl\dll.dll
F:\win2k\system32\ntdll.dlll
F:\win2k\system32\kernel32.dll
在下列位置找到转储文件 exmpl.dmp:
C:\qa\dumps\exmpl.dmp
Visual Studio 将搜索下列位置:
C:\qa\dumps\exmpl.exe
C:\qa\dumps\exmpl\exmpl.exe
C:\qa\dumps\qa\exmpl\exmpl.exe
D:\qa\exmpl\exmpl.exe
C:\qa\dumps\dll.dll
C:\qa\dumps\exmpl\dll.dll
C:\qa\dumps\qa\exmpl\dll.dll
D:\qa\exmpl\dll.dll
C:\qa\dumps\kernel32.dll
C:\qa\dumps\system32\kernel32.dll
C:\qa\dumps\win2k\system32\kernel32.dll
F:\win32\system32\kernel32.dll
在以前的 Visual Studio 版本中,MODPATH 参数用于指定附加的模块搜索路径。 Visual Studio 在指定的符号搜索路径中查找模块,而不使用 MODPATH。