Windows调试符号 - 未加载

时间:2011-08-21 06:40:25

标签: debugging visual-c++ debug-symbols pdb-files symbol-server

我使用的是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的完整路径):

enter image description here

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

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

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

有时VS也会将符号放在:

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

转到:

工具 - 选项 - 调试 - 符号

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

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