6

我有 Windows 7 x64 SP1。我已从以下位置下载符号:

http://msdn.microsoft.com/en-us/windows/hardware/gg463028

我已经为 Windows 7 x64 SP1 下载并安装了 x64 RTM 和 x64 SP1 符号。安装在T:\Symbols文件夹中。

但是当我调试 64 位本机 C++ 应用程序时,符号根本不会加载。例如ntdll.dll,PDB 位于:

  • T:\Symbols\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12
  • T:\Symbols\ntdll.pdb\CFF40300FD804691B73E12CF2A150EE02

但是 Visual Studio (2008/2010) 不会加载符号。在调试时,从模块视图中,我选择ntdll.dll并说Load Symbols From -> Symbol Path,指定ntdll.pdb. 对于提到的两条路径,它总是会说:

在此文件夹中未找到匹配的符号文件。

我还添加了这个文件夹 ( T:\Symbols) Debugging -> Options,但它仍然不会加载符号。在调试时,Load All Symbols按钮将被启用,并且单击也不会加载符号!

对于 32 位,PDB 文件名将wntdll.pdb用于ntdll.dll并且将以上述方式存储在以 GUID 命名的文件夹中。但是 VS 也不会为 32 位调试加载符号。

非常有趣(也令人沮丧),当我选择 时,它会完美地Load Symbols From -> Microsoft Symbols Server下载和加载符号。它将在以下位置下载符号(完整路径ntdll):

在此处输入图像描述

\Users\...\AppData\Local\Temp\SymbolCache\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12

在这里您可以看到 GUID 与路径中以 GUID 命名的文件夹匹配T:\Symbols,但是对于手动安装的符号 VS 是刚性的,不加载它!

对于 NTDLL.PDB,尽管各自的文件夹相同,并且 PDB 的大小也相同,但时间戳可能会有所不同。

有时 VS 也会在以下位置放置符号:

C:\...\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols

如果 VS 只能从 Microsoft Symbols Server 下载正确的符号,那么本地下载的符号有什么用?

我的问题基本上是如何加载本地下载和安装的符号?

4

1 回答 1

11

RTM 或 SP1 符号的下载链接几乎没有用。在每个补丁日之后,您将获得更改后的 ntdll.dll 或其他中央操作系统库。这将使您的“旧” pdbs 无用。因此,您需要从符号服务器下载它们以确保您是最新的。

但由于并非所有 dll 都已更改,因此您应该将 Symbol 服务器下载缓存设置为解包下载符号的位置。

去:

工具 - 选项 - 调试 - 符号

并在此目录中设置缓存符号的路径。

加载所有符号意味着您确实为当前进程中加载​​的所有模块加载了所有符号。但它不会下载 Windows 使用的所有 dll 的所有符号。如果你确实下载了 Windbg,你会得到一个名为 symchk.exe 的工具,它允许你递归地下载所有二进制文件的符号。

于 2011-08-21T07:38:03.587 回答