我使用的是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与T:\Symbols
路径中的GUID命名文件夹匹配,但对于手动安装的符号,VS严格禁止加载!
对于NTDLL.PDB,尽管相应的文件夹相同,并且PDB的大小也相同,但时间戳可能不同。
有时VS也会将符号放在:
C:\...\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols
如果VS只能从Microsoft Symbols Server下载正确的符号,那么使用本地下载的符号是什么?
我的问题基本上是如何加载本地下载和安装的符号?
答案 0 :(得分:10)
RTM或SP1符号的下载链接几乎没用。每个补丁日后,您将获得更改的ntdll.dll或其他中央OS库。这将使您的“旧”pdbs无用。因此,您需要从符号服务器下载它们,以确保您是最新的。
但是,由于并非所有dll都已更改,因此您应将Symbol服务器下载缓存设置为已解压缩下载符号的相同位置。
转到:
工具 - 选项 - 调试 - 符号
并在此目录中设置Cache符号的路径。
加载所有符号意味着您为当前进程中加载的所有模块加载所有符号。但它不会下载Windows使用的所有dll的所有符号。如果你下载Windbg,你会得到一个名为symchk.exe的工具,它允许你递归地下载所有二进制文件的符号。