纯阳门派宠物隐雪:使用 Microsoft Symbol Server获取调试符号文件

来源:百度文库 编辑:中财网 时间:2024/04/28 22:14:32

在VS中调试程序的时候,不可避免会遇到系统DLL文件的调用,比如Ntdll.dll、kernel32.dll等,但是这些系统文件在本地是没有调试信息的,所以在call stack window中经常会看类似 ntdll.dll!7c92e01b()的条目,我们知道这是一个函数,但看不出函数的名称。只能看出这个函数所在的DLL文件的名称,以及该函数在dll文件中的位置,此时可以设置VS的选项Load DLL Exports,从而可以获得DLL文件导出的文件的名称。ntdll.dll!7c92e01b()将被显示为ntdll.dll!NtQueryInformationProcess(),我们得到了函数名称。但是这只能到DLL文件的导出函数一级,对于DLL中的非导出函数VS仍然不能获得函数名,因为DLL导出表中没有DLL内部函数的调试信息。关于Load DLL Exports的说明参考附录A。

Microsoft提供了Symbol Server用于解决这类的问题,在该服务器上提供了Windows和.Net等各类Microsoft的产品的Symbol,也就是pdb文件,有了这些文件,我们就能很容易地定位code了,也能看到系统dll文件内部的函数的名称了。
在《How to use a symbol server with the Visual Studio .NET debugger》http://support.microsoft.com/default.aspx?scid=kb;en-us;319037
和《使用 Microsoft Symbol Server 获取调试符号文件》http://support.microsoft.com/kb/311503/这两篇文章中介绍了symbol server的使用方法。

总结一下:
1. Microsoft使用了 Symbol Server 技术。Microsoft Symbol Server 是使用 Debugging Tools for Windows 软件包附带的 SymSrv 技术 (SymSrv.dll) 构建的。SymSrv 会生成本地符号高速缓存,以进行快速、自动的符号解析。在支持该技术的IDE的执行目录下可以找到SymSrv.dll文件,比如在C:\Program Files\Microsoft Visual Studio 8\Common7\IDE目录下就存在SymSrv.dll文件。如果启用了Symbol Server 技术。则在调试的过程中SymSrv将会根据当前加载的DLL自动从微软的服务器上下载对应的Symbol文件,并保存到本地指定的目录中,以备调试使用。
2. 在IDE中启用Symbol Server技术。启用的过程就是指定Symbol文件路径的过程。在VS.NET2003中有三种设置的方法:
(1)、通过在系统中添加_NT_SYMBOL_PATH环境变量的方式设置Symbol全局可用。
如果在 _NT_SYMBOL_PATH 环境变量中提供了正确的 symsrv 语法,常见的 Microsoft 调试工具就会使用 SymSrv 技术。这些工具会自动包括您在该变量中提供为符号路径的任何内容。例如:
Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols
(2)、只供某个解决方案使用。在解决方案的属性?“Common Properties”?“Debug Symbol Files”中添加一个新的Symbol File的路径,比如:symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。
(3)只供某个工程使用。在工程的属性页?“Debugging”?“Symbol Path”一栏中添加Symbol File文件的路径,比如symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。

在VS2005中的设置方法不同:在2005中是通过“工具”?“选项”?“调试”?“符号”来设置Symbol File的路径的。参考附录B。

3. 启动Symbol Server之后,第一次调试的时候,IDE将要从Server上下载调试信息,所以第一次调试的时候速度将会比较慢。为此微软提供了一个工具SymChk.exe用于下载Symbol文件到本地机器。SymChk.exe的使用方法参考附录D。

附录A:MSDN中关于Load DLL Exports的说明
若要访问“本机”页,请单击“工具”菜单并选择“选项”。在“选项”对话框中,展开“调试”节点并选择“本机”。该页允许为调试本机应用程序设置下列选项。
加载 DLL 导出
选定后,加载 DLL 导出表。处理 Windows 98 系统 DLL、Windows 消息、Windows 过程 (WindowProc)、COM 对象、封送或任何您不具有其符号的 DLL 时,DLL 导出表中的符号信息很有用。读取 DLL 导出信息需要一些开销,因此该功能默认情况下是关闭的。
若要查看 DLL 导出表中的可用符号,请使用 dumpbin /exports。符号可用于任何 32 位系统 DLL。通过阅读 dumpbin /exports 输出,可以查看到精确的函数名,包括非字母数字字符。这对于在函数上设置断点很有用。DLL 导出表中的函数名在调试器的其他位置可能似乎被截断了。调用将按调用顺序列出,当前函数(嵌套最深的函数)位于顶部。有关更多信息,请参见 dumpbin /exports。

附录B:VS2005 MSDN中《如何:指定一个符号路径》
为调试代码,调试器需要包含应用程序的符号的 PDB 文件(或旧格式的 DBG 文件)。默认情况下,调试器在与 EXE 或应用程序相同的位置查找这些文件。
如果需要调试系统或第三方 DLL,则还必须通知调试器这些 DLL 的 PDB 或 DBG 文件的所在位置,所以必须指定这些 DBG 或 PDB 文件的所在路径以便调试器可以找到它们。
向符号文件(.pdb 或 .dbg)位置列表添加路径名
1. 从“工具”菜单中选择“选项”。
2. 在“选项”对话框中,单击“调试”节点将其打开。
3. 在“调试”下,选择“符号”类别。
4. 在“符号”页上有一个显示“符号文件 (.pdb) 位置”的框。该框上方有四个图标。单击文件夹图标,可编辑文本即出现在“符号文件 (.pdb) 位置”框中。
5. 编辑文本以添加新的路径名。语句完成功能有助于获得正确的格式。
6. 确保“只在手动加载符号时搜索上述位置”未被选中,除非在调试时要手动加载符号。
7. 如果要使用远程符号服务器上的符号,通过指定一个可将符号复制到其中的本地目录,您将能够提高性能。为此,请使用“将符号从符号服务器缓存到此目录”框。注意,如果正在调试远程计算机上的程序,则缓存目录是指远程计算机上的目录。
8. 单击“确定”。

附录C:VS2005 MSDN中《如何:使用符号服务器》
可以使用符号服务器以允许 Visual Studio 自动下载用于调试 Visual Studio 项目的正确符号。
Microsoft 为开发人员维护了一台公共符号服务器,地址是 http://msdl.microsoft.com/download/symbols。此服务器仅用于符号下载。它是不可浏览的。此服务器为各种操作系统(如 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003)以及 MDAC、IIS、ISA 和 .NET Framework 提供符号。
另外,您也可以将本地符号服务器安装在 Intranet 上或本地计算机上。
若要使用符号服务器,请按照下面的过程的描述,在 Visual Studio 选项中指定服务器的路径。
可以从“选项”对话框中的“符号文件 (.pdb) 位置”列表中移除路径。
设置符号服务器的路径
1. 在“调试”菜单上,单击“选项”。
2. 在“选项”对话框中打开“调试”节点,然后单击“符号”。
3. 编辑文本以添加符号服务器的新路径。
若要使用 Microsoft 公共符号服务器,请输入: http://msdl.microsoft.com/download/symbols
若要使用 Intranet 符号服务器,请输入:\\server\path\symbols
若要使用本地计算机上的符号服务器,请输入:c:\path\symbols
4. 确保“只在手动加载符号时搜索上述位置”未被选中,除非在调试时要手动加载符号。
5. 如果使用远程符号服务器上的符号,通过指定符号能够复制到的本地目录可以提高性能。若要执行此操作,请在“将来自符号服务器的符号缓存至此目录”框中输入一个路径。若要连接至 Microsoft 公共符号服务器,您需要启用此设置。注意,如果在远程计算机上调试程序,缓存目录指的是远程计算机上的目录。
6. 单击“确定”。
7. 如果使用的是 Microsoft 公共符号服务器,则会出现“最终用户许可协议”对话框。单击“是”可接受该协议并将符号下载至本地缓存。

附录D:使用 SymChk.exe 实用工具下载符号
您可以使用 SymChk.exe 实用工具,验证符号并以便捷、非侵入的方式生成本地符号高速缓存。SymChk.exe 实用程序随 Debugging Tools for Windows 软件包提供。SymChk.exe 是一种命令行工具。您可能需要将 Debugging Tools for Windows 软件包的文件夹添加到系统上的 PATH 环境变量,以便从任意命令提示符下访问该工具。

要使用 SymChk.exe 实用程序下载 Windows\System32 文件夹中所有组件的符号文件,请使用以下命令行命令:
symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
在此示例中:
• “/r c:\windows\system32”查找 System32 文件夹和所有子文件夹中的所有符号文件。
• “/s SRV*c:*http://msdl.microsoft.com/download/symbols”指定用于符号解析的符号路径。在此例中,“c:\symbols”是将在其中从符号服务器复制符号的本地文件夹。
要获取 SymChk.exe 命令行选项的更多信息,请在命令提示符下键入 symchk /?。其他选项包括指定正在运行的可执行文件的名称或进程 ID (PID) 的功能。