【发布时间】: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.dll? This文章说:
未加载符号的一些常见原因包括:
- 符号路径未指向正确的位置
- 符号文件来自与进程中加载的不同版本的模块 - 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