为什么pdb for ntdll.dll没有缓存

时间:2016-11-07 21:06:16

标签: c++ debugging visual-studio-debugging pdb-files

我正在Visual Studio Community 2013下开发C ++。它是C ++ / Win32项目而不是UWP,它作为Debug / x64平台运行。

我的配置是:

Tools -> Options -> Debugging -> Symbols -> All module, unless excluded
Tools -> Options -> Debugging -> Symbols -> Cache symbol in this directory 

缓存符号目录包含大量*.pdb个文件,但从未触及过。

问题: 当我偶尔运行调试器时,我收到有关联系MS符号服务器以下载ntdll.dll和其他一些我认为系统相关的文件的消息,因为我不认为它们是我项目的一部分。

为什么要下载ntdll.dllThis文章说:

  

未加载符号的一些常见原因包括:

     
      
  1. 符号路径未指向正确的位置
  2.   
  3. 符号文件来自与进程中加载​​的模块不同的模块版本 - Visual Studio要求符号文件来自与模块完全相同的构建。即使源代码相同,它也无法加载来自不同构建的符号
  4.   

我没有重建ntdll.dll,我怎么能这样?这是不可能的,因为它是Windows内核的一部分,那么为什么要一次又一次地下载ntdll.dll的调试符号而不是缓存呢?

修改

当我运行调试(F5),然后在Debug -> Windows -> Output下我看到以下行:

'MyProject.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Loading disabled by Include/Exclude setting.

Debug -> Windows -> Modules的输出:

ntdll.dll   C:\Windows\System32\ntdll.dll   N/A No  Loading disabled by Include/Exclude setting.        2   10.0.14393.447 (rs1_release_inmarket.161102-0100)   11/2/2016 11:13 AM  00007FFFDF410000-00007FFFDF5E1000   [12772] MyProject.exe       

正如我所说,它偶尔发生,所以我不知道我究竟能够如何重现这一点。似乎在过去的时间它正在运行,ntdll.dll不再从MS服务器下载。我无法将x64更改为x86,因为我们的项目不能在x86上运行。

我的C:\Users\wakatana\AppData\Local\Temp\SymbolCache包含以下文件夹/文件(我猜一个可能用于x86,另一个用于x64,但我不确定):

ntdll.pdb\41C94DD545BD4FCBA2E8F404185B97DC1\ntdll.pdb
ntdll.pdb\77A5329C3B1E425FAA9519DA285D8DA71\ntdll.pdb

是否可以明确告诉VS在ntdll.dll中使用已经缓存的C:\Users\wakatana\AppData\Local\Temp\SymbolCache版本用于所有新项目或默认的VS行为是什么?

我的操作系统是带有最新更新的Windows10 Home

1 个答案:

答案 0 :(得分:0)

这与这个特定的集会有关。

如果我使用X86 Target,我将获得wntdll.pdb文件。

enter image description here

如果我使用X64目标,我将获得ntdll.pdb文件,但与您的一样,它们都在temp \ SymbolCache文件夹中。我还获取了信息"源信息剥离消息"在X64目标中。它在TOOLS-> Options-> Debugging-> Symbols下的默认符号文件夹中确实没有pdb文件。

enter image description here

由于我遇到了与您相同的问题,因此我向产品团队提交了一份连接报告:

https://connect.microsoft.com/VisualStudio/feedbackdetail/view/3113479/why-isnt-pdb-for-ntdll-dll-cached

您也可以添加评论并投票。