Windows调试符号 - 未加载

Aja*_*jay 6 debugging debug-symbols symbol-server visual-c++ pdb-files

我有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下载正确的符号,那么使用本地下载的符号是什么?

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

Alo*_*aus 11

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

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

去:

工具 - 选项 - 调试 - 符号

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

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

  • 不,你不应该.如果您需要未连接到Internet的计算机的最新符号,则使用带有`/ om`参数的`symchk`创建清单,然后复制清单(*不是所有.exe/.dll /. ..文件*)到具有Internet访问权限的计算机.在那里你可以再次使用`symchk`,但这次使用`/ im`参数,下载清单引用的文件的PDB. (3认同)
  • 然后,您应该将目标系统的dll和exes复制到具有Internet访问权限的计算机,并使用symchk.exe下载匹配的pdbs. (2认同)