65.9K
CodeProject 正在变化。 阅读更多。
Home

[调试] - 符号

2006年5月18日

CPOL

7分钟阅读

viewsIcon

183981

设置 Microsoft 符号服务器

引言

本文介绍如何设置和使用 Microsoft 符号服务器,以帮助您在 Windows 上调试应用程序。Microsoft 提供了一个 Internet 符号服务器的访问权限,该服务器包含 Microsoft Windows Server 2003、Windows XP 和 Windows 2000 操作系统以及其他 Microsoft 产品的符号文件。

在使用各种 Microsoft 工具调试应用程序时,必须提供符号信息(通常存储在 PDB 文件中)。
调试符号为您提供了可执行文件和动态链接库(DLL)中包含的函数的足迹。此外,在调试应用程序时,符号文件可以通过帮助您查看应用程序的完整调用堆栈来指向导致失败的函数调用。

Microsoft 符号服务器是使用 SymSrv 技术(SymSrv.dll)构建的,它使用该技术来构建本地符号缓存,以实现快速、自动的符号解析。符号服务器包含所有最新服务包和安全修复程序的符号。

磁盘空间

要安装操作系统的完整符号集及其相关文件,您至少需要 1GB 的可用空间。实际使用量应少于此(约 550MB-750MB),但 1GB 将允许符号服务器在需要时自动下载新符号。

安装

为了设置符号服务器,您需要从 Microsoft 下载它,它是 **Windows 调试工具**套件的一部分(始终下载最新版本)。

您可以从以下位置下载相应版本:

配置符号服务器

在使用符号服务器之前,您需要对其进行配置。
这非常简单,只需设置 _NT_SYMBOL_PATH 环境变量即可。设置好此路径后,您会发现大多数常见的 Microsoft 调试工具都会自动使用它。

此变量可以是系统或用户环境变量,要从桌面设置它,请右键单击**我的电脑**,然后单击**属性**。选择**高级**选项卡,然后单击**环境变量**按钮。

您需要将此变量设置为以下值:

SRV*e:\localsymbols*http://msdl.microsoft.com/download/symbols 

在上面的示例中,我告诉符号服务器我希望本地缓存位于 e:\localsymbols 文件夹中。您需要修改它以指向您想要使用的位置。

您可以在下面的屏幕截图中看到我的符号路径,位于系统变量列表中。

使用 SymChk.exe 工具下载符号

SymChk.exe 工具可用于快速构建本地符号缓存,而不是等待调试应用程序时逐一下载符号。此工具包含在 Windows 调试工具包中。

SymChk.exe 是一个命令行工具。您可以为了方便起见,将 Windows 调试工具文件夹添加到您的 PATH 环境变量中,这样就可以从任何命令提示符访问它。
在命令提示符下键入以下命令,将符号路径(e:\localsymbols)替换为您选择的路径。

symchk /r c:\windows\system32 /s
    SRV*e:\localsymbols\*http://msdl.microsoft.com/download/symbols 

在上例中:

  • /r c:\windows\system32 - 查找 System32 文件夹及其任何子文件夹中所有文件的符号
  • /s SRV*e:\localsymbols\*http://msdl.microsoft.com/download/symbols - 指定用于符号解析的符号路径。在这种情况下,e:\localsymbols 是将从符号服务器复制符号的本地文件夹。

将符号服务器与 Visual Studio .NET 或 Visual Studio 2005 调试器结合使用

本节介绍如何将 Visual Studio .NET 或 Visual Studio 2005 调试器与符号服务器结合使用。
这样,它们就可以从符号服务器自动加载符号,前提是这些符号尚未出现在您的本地缓存中。

在开始之前,请确保您已下载最新的 Windows 调试工具并设置了 _NT_SYMBOL_PATH 环境变量。

  1. c:\Program Files\Debugging Tools for Windows 文件夹中找到 Symsrv.dll 文件。
  2. 关闭所有正在运行的 Visual Studio .NET 或 Visual Studio 2005 实例。
  3. Symsrv.dll 文件复制到 C:\Program Files\Microsoft Visual Studio .NET\Common7\IDEC:\Program Files\Microsoft Visual Studio 8\Common7\IDE 文件夹。

下次启动 Visual Studio .NET 或 Visual Studio 2005 时,您可以使用 Symsrv.dll 文件查找您指定的符号服务器。

将自己的符号添加到符号服务器缓存

在开发和调试自己的应用程序时,您可以使用 SymStore.exe 工具将自己的符号添加到本地符号缓存中。
这将允许调试器自动检索所需的符号,每次调试时都能获得几乎完整的调用堆栈。

SymStore 随 Windows 调试工具一起提供,您应该参考其文档以获取有关使用 SymStore 的完整信息。

以下各节展示了一种添加自己的符号然后从符号缓存中删除它们的简单方法。

通常,应用程序的符号将存储在可执行映像本身(MyApp.exe)或单独的程序数据库文件(MyApp.pdb)中。

SymStore 事务

每次调用 SymStore 都会被记录为一次事务,事务有两种类型:添加和删除。在删除符号时,您需要了解这些事务的工作原理,因为您需要使用添加符号时分配的事务号。
这显然很麻烦,但由于您主要是在向缓存中添加符号,所以这并不是一个真正的问题,您只需要偶尔删除一次符号。

当您首次创建符号缓存时,将在缓存的**根**文件夹下创建一个名为 000admin 的文件夹。此文件夹包含每个事务一个文件,以及两个日志文件:server.txthistory.txt

server.txt 文件包含当前服务器上所有事务的列表。history.txt 文件包含所有事务的按时间顺序排列的历史记录。

每次添加符号时,SymStore 都会生成一个新的事务号,并在 000admin 文件夹中创建一个以此命名的文件。
此文件包含在此事务期间添加到符号缓存的所有文件的列表。删除符号时,SymStore 将使用此文件来确定应从缓存中删除哪些文件。删除操作也将分配一个新的事务号。

添加符号

要将自己的应用程序符号添加到缓存,您需要指定缓存的位置和包含符号的文件夹的路径。
以下示例展示了如何将名为 SymbolTest 的应用程序的符号添加到存储在 d:\Symbols 中的缓存中。
我们告诉 SymStore 从指定文件夹递归搜索(/r)符号。

symstore add /r /f d:\MyStuff\Code\SymbolTest\*.* /s d:\Symbols /v "Build 1"

在此示例中:

  • /f d:\MyStuff\Code\SymbolTest\*.* - 查找 SymbolTest 应用程序的所有符号
  • /s d:\Symbols - 指定本地符号缓存的**根**文件夹
  • /v "Build 1" - 指定产品的版本

事务 - 0000000001

当我添加 SymbolTest 的符号时,SymStore 创建了一个事务文件(文件名:0000000001),其中包含添加到缓存的每个符号文件的名称。其内容如下所示:

"vc70.pdb\6BE4B8055F6846F5A2BB748B91DA5FD9",
            "D:\My Stuff\SymbolTest\release\vc70.pdb"
"SymbolTest.pdb\96CE1B9F227349DD948B38831D9161A11",
            "D:\My Stuff\SymbolTest\release\SymbolTest.pdb"

注意SymStore 不支持来自多个用户的并发事务。Microsoft 建议指定一名用户作为符号存储管理员,并由其负责所有添加/删除事务。

删除符号

要从缓存中删除符号,您需要知道初始添加事务的 ID。请参阅上一节“**添加符号**”以确定事务 ID。在此示例中,该值为 0000000001

您需要在命令行中向 SymStore 指定要删除的事务编号以及符号缓存的路径,如下例所示。

symstore del /i 0000000001 /s d:\Symbols

结论

现在,您在调试时应该拥有完整的符号信息,包括您正在使用的任何操作系统的完整符号。在多开发人员环境中,他们可以通过将符号存储放在网络位置上供所有人访问来共享同一个符号存储。

历史

  • 1.02(2007 年 6 月 21 日)- 更新了屏幕截图并修复了一些拼写错误
  • 1.01(2006 年 5 月 24 日)- 添加了关于如何将自己的符号添加到符号服务器缓存的部分
  • 1.00(2006 年 5 月 17 日)- 首次公开发布
© . All rights reserved.