【问题标题】:Why isn't pdb for ntdll.dll cached为什么不缓存 ntdll.dll 的 pdb
【发布时间】:2016-11-07 21:06:15
【问题描述】:

我正在 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. 符号文件来自与进程中加载​​的不同版本的模块 - Visual Studio 要求符号文件来自与模块完全相同的版本。即使源代码相同,它也无法加载来自不同版本的符号

我还没有重建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 对所有新项目使用 C:\Users\wakatana\AppData\Local\Temp\SymbolCache 中已缓存的 ntdll.dll 版本,或者 VS 的默认行为是什么?

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

【问题讨论】:

  • 我刚刚禁用了符号服务器并接受了有关丢失 pdb 文件的警告。虽然我想看到一个解决这个痛苦的答案。
  • 您必须更好地记录您的问题。连接调试器后,使用 Debug > Windows > Modules。右键单击列表中的 ntdll.dll 并选择“符号加载信息”。将框中的内容复制/粘贴到您的问题中。并提及您的 Windows 版本。
  • @WakanTanka,你能告诉我你调试的项目类型吗?在您每次调试应用程序期间,此 dll 文件是否真的是从符号服务器下载的?据我所知,Windows 10 家庭版对于某些应用程序(如 UWP 或其他应用程序)有一些限制,所以如果您的应用程序运行正常,如果您使用“不调试启动”执行它,请更改调试/发布平台目标,如 X86/ x64安装了Any CPU,结果如何?
  • @Wakan Tanka,在您的调试模式窗口中,您是否收到此 dll 文件的“源信息剥离消息”消息? social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • @JackZhai-MSFT 我已经更新了 OP

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


【解决方案1】:

这将与这个特定的程序集有关。

如果我使用 X86 Target,我会得到 wntdll.pdb 文件。

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

因为我遇到了和你一样的问题,所以我向产品团队提交了一份连接报告:

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

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

【讨论】:

  • 抱歉稍后回复我已对您的帖子投了赞成票并接受了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2016-11-24
  • 2016-04-27
  • 1970-01-01
相关资源
最近更新 更多