Performance WinDbg加载符号需要非常长的时间;正在搜索大型网络UNC符号存储中的每个目录

Performance WinDbg加载符号需要非常长的时间;正在搜索大型网络UNC符号存储中的每个目录,performance,debugging,windbg,symbols,freeze,Performance,Debugging,Windbg,Symbols,Freeze,在调试崩溃转储时,我花了几天时间试图加快符号的加载速度,但我无法克服一个特定的问题 问题在于,当转储中某个模块的符号不存在于任何可访问的符号存储或符号服务器位置(例如,它是没有可用符号的第三方模块)时,WinDbg将花费数小时寻找它们 我已正确设置符号路径,以正确设置搜索顺序和缓存目录: .sympath cache*C:\SymbolCache1;\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/downl

在调试崩溃转储时,我花了几天时间试图加快符号的加载速度,但我无法克服一个特定的问题

问题在于,当转储中某个模块的符号不存在于任何可访问的符号存储或符号服务器位置(例如,它是没有可用符号的第三方模块)时,WinDbg将花费数小时寻找它们

我已正确设置符号路径,以正确设置搜索顺序和缓存目录:

.sympath cache*C:\SymbolCache1;\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/download/symbols
使用
运行!sym嘈杂
。重新加载/f
我可以看到:

SYMSRV:  Notifies the client application that a proxy has been detected. 
SYMSRV:  Connecting to the Server: http://msdl.microsoft.com/download/symbols. 
SYMSRV:  Successfully connected to the Server. 
SYMSRV:  Sending the information request to the server. 
SYMSRV:  Successfully sent the information request to the server. 
SYMSRV:  Waiting for the server to respond to a request. 
SYMSRV:  Successfully received a response from the server. 
SYMSRV:  Closing the connection to the Server. 
SYMSRV:  Successfully closed the connection to the Server. 
SYMSRV:  c:\SymbolCache1\Some3rdParty.dll\0060D200cd1000\Some3rdParty.dll not found 
SYMSRV:  c:\SymbolCache2\Some3rdParty.dll\0060D200cd1000\Some3rdParty.dll not found 
SYMSRV:  http://msdl.microsoft.com/download/symbols/Some3rdParty.dll/0060D200cd1000/Some3rdParty.dll not found 
<---- !!!! hanging here with *BUSY* showing in WinDbg
我到处寻找,认为一定有某种标志来控制这一切,但我似乎找不到它

有几件事:

  • 这不是网络速度或缺少本地符号缓存的问题。该问题仅出现在找不到的符号上,并且仅出现在UNC符号存储中(例如,不出现在Microsoft符号服务器上)
  • 我已经试过使用SYMOPT_NO_PUBLICS而不是SYMOPT_AUTO_PUBLICS
  • 我已经使用
    sympath
    命令验证了我的符号路径是我所期望的。我还尝试使用
    \u NT\u SYMBOL\u PATH
    环境变量
  • 我知道我可以通过配置文件排除某些符号,但这不是一个可行的解决方案,因为有时丢失的符号名称事先不知道
  • 我在互联网上看到其他人也有同样的问题,并在微软论坛上发表了一篇题为“”的帖子,但没有得到任何帮助

我终于找到了一个令人不满意但非常好的解决方案:建立一个

这使我可以从符号路径中删除UNC共享,并将其替换为对作为http符号服务器的SymProxy的引用

.sympath SRV*C:\SymbolCache*http://somemachine.our.corp/Symbols
代理本身仍在UNC共享中搜索,但WinDbg无法再搜索网络目录——相反,它必须传递有关要SymProxy的符号的信息,SymProxy只在UNC共享上的一个位置进行搜索,而不是进行彻底的搜索

这并不能解释为什么WinDbg搜索整个UNC共享,但它确实解决了WinDbg在搜索符号时挂起的问题。最后,符号加载又快了

安装SymProxy的另一个优点是,可以将其设置为从多个符号位置提取。例如,您可以将其连接到本地组织的符号存储以及Microsoft符号服务器。然后,开发人员可以将其符号路径设置为仅引用SymProxy,而不是多个符号位置。

这不应该是:

.sympath cache*C:\SymbolCache1;SRV*\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/download/symbols  
也就是说,通过列出不带
SRV*
\\our.corp\SymbolStore
,您告诉dbghelp在这个非结构化目录中查找符号。如果您使用SRV*语法,那么您告诉dbghelp让symsrv以一种非常具体和结构化的方式查看该目录


symsrv.dll可以高效地搜索Microsoft的symbol服务器,也可以高效地搜索您的symbol服务器,如果您告诉它使用
SRV*

这样做,我已经尝试过这种方法,它也解决了问题,而且不需要设置Symboxy,这是一个额外的好处。也许我没有看到,但据我所知,上的MS文档没有提供在非http符号服务器上使用SRV*的示例。如果他们能够改进文档以包含此内容,那将是非常棒的。不管怎样,谢谢你的澄清!我猜SRV*是部落知识。在我自己关于symbol服务器的博客文章中,我使用了SRV*,但从未真正解释过它的含义。我可能需要更新一下。为了结束这个循环,从今天开始,布鲁斯似乎已经用这个信息更新了他前面提到的博文。你救了我的理智,谢谢!!!
.sympath cache*C:\SymbolCache1;SRV*\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/download/symbols