阻止 Visual Studio 尝试为特定 DLL 加载符号

Posted

技术标签:

【中文标题】阻止 Visual Studio 尝试为特定 DLL 加载符号【英文标题】:Prevent Visual Studio from trying to load symbols for a particular DLL 【发布时间】:2009-05-15 14:53:52 【问题描述】:

我已将 Visual Studio 2005 设置为使用 Microsoft 的符号服务器。我还安装了UltraMon,它将一个钩子DLL注入到每个进程中。每当我开始调试我的 MFC 应用程序时,Visual Studio 都会说:

"Loading symbols for C:\Program Files\UltraMon\RTSUltraMonHookX32.dll..."

从眨眼到几十秒的任何时间。它永远找不到那些符号...我可以告诉它不要费心去寻找吗?

(我尝试创建一个空的RTSUltraMonHookX32.pdb 文件,但Visual Studio 认为它不好并继续查找。)

【问题讨论】:

【参考方案1】:

您不能以非常精细的方式执行此操作,但您可以禁用自动符号加载,然后通过模块窗口(调试 -> Windows -> 模块)手动选择要加载的符号。

禁用自动符号加载

工具 -> 选项 -> 调试 -> 符号 勾选“仅在手动加载符号时搜索上述位置”

【讨论】:

显然这个选项在 Visual Studio 2019 中消失了?【参考方案2】:

还要检查您是否没有“_NT_SYMBOL_PATH”环境变量。如果你有这个 var 符号,无论 VS 设置如何,都会加载。

【讨论】:

【参考方案3】:

从 Visual Studio 2010 起,您可以转到:

Tools -> Options -> Debugging -> Symbols -> Specify excluded modules

并输入加载时间过长的 dll 列表。我使用输出窗口给出的完整路径;也许它接受通配符或简单的文件名。

【讨论】:

很遗憾这在 Visual Studio 2005 中不可用,但很高兴知道它在更高版本中存在。 @RichieHindle 确实;但是 IIRC,JaredPar 的方法可以在 VC2005 中使用。 确实可以使用通配符。微软提供了一个非常令人困惑的 UI,没有一个关于可能的通配符的注释。例如,我可以通过在列表中添加“DevExpress*”来禁用 DevExpress 符号加载。 哇,太好了!疯狂的!在此之前我有 4 秒的开始时间,它已经说“加载被包含/排除设置禁用”。但是在我添加所有这些(20 个)之后,它下降到 2 秒(Visual Studio 2017)。一定是符号加载系统中的一个错误,即使 VS 在此之前假装不加载符号,这也可以减少 50%(我的集合中没有 _NT_SYMBOL_PATH)。 我从输出窗口确认该符号已被排除 (oleaut32.dll),但随后它仍然尝试加载该库的符号。【参考方案4】:

就我而言,这是因为我在

中将“启用.Net Source Stepping”设置为true
Tools > Options > Debugging > General. 

我没有将其设置为 false,而是将“仅启用我的代码”设置为 true,这会自动将“启用 .Net Source Stepping”设置为 false。在这样做之前它给了我一个警告:

Enabling Just my code automatically disabled .Net framework source stepping

这表明Just My Code.Net source stepping互斥的

我希望这对某人有所帮助。

【讨论】:

天啊!实际上将其设置为 Enable .Net Source Stepping 为 true 并禁用 Just My Code 会使错误消失。这与你所说的相反,但它起到了作用。非常感谢!【参考方案5】:

您还可以在 HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\Exclusions 或 HKEY_LOCAL_MACHINE\Software\Microsoft\Symbol Server\Exclusions 或通过 .ini 文件在 % 中设置不会尝试下载的符号服务器排除项WINDIR%\system32\inetsrv\Symsrv.ini(使用标题 [exclusions] 并将每个排除项放在自己的行上)。排除项是简单的模式匹配,因此请使用 msxml5.*。

【讨论】:

这听起来很完美,但对我不起作用。我已经在注册表中添加了条目,并创建了一个包含正确条目的 symsrv.ini,并重新启动了我的机器以防万一,但 Visual Studio 仍然尝试加载符号。有什么想法吗? 对我也不起作用。但据我了解,此列表仅适用于 PDB,不适用于 DLL。【参考方案6】:

不仅_NT_SYMBOL_PATH 会导致这种行为,而且对我来说,是_NT_ALT_SYMBOL_PATH 环境变量导致了延迟。

(我相信我在尝试 WinDbg 时添加了这个变量)

【讨论】:

【参考方案7】:

如果你去 Debug Options -> Symbols 然后勾选 "load only specified symbols" ,它不会自动加载符号并且调试器可以正常工作。

【讨论】:

【参考方案8】:

在 Visual Studio 2013 Pro 中,如果选中 Microsoft Symbol Server,VS 将尝试在其服务器上加载所有符号,从而导致大量额外时间。

【讨论】:

【参考方案9】: 手动从 MS 网站加载所有符号包,将它们放在 SSD 驱动器上以提高速度:-) 如果您有“_NT_SYMBOL_PATH”环境变量,请从“SRVe:\symbols*http://msdl.microsoft.com/download/symbols”中删除部分“http://msdl.microsoft.com/download/symbols”,这样您就只有符号路径了符号实时下载。 现在您已支持符号,但它们不会从 MS 下载,而是从驱动器加载

【讨论】:

人们通常会问这个问题,因为他们根本不需要符号,而不是因为他们不想通过互联网下载并且不知道如何在本地使用它。他们只想永远关闭它。 @user5280911 好吧,关闭它的主要动机可能是加载符号时对性能的影响。如果加载速度很快,则不希望它消失的主要原因。

以上是关于阻止 Visual Studio 尝试为特定 DLL 加载符号的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中使用 Git 时出现“冲突阻止签出”错误

如何阻止Visual Studio向我的web.config添加程序集?

如何阻止 Visual Studio 在我的代码中插入不可编辑的空白行

Visual Studio如何使用键盘导航?

Visual Studio 的“发布”功能阻止我的 ASP.NET MVC 应用程序编译

阻止 Visual Studio 将 using 指令放在命名空间之外