我花了几天时间尝试使用调试故障转储时加快符号加载速度WinDbg https://msdn.microsoft.com/en-US/windows/hardware/gg454513,而且我无法解决一个特定的问题。
问题是,当转储中模块的符号不存在于任何可访问的符号存储或符号服务器位置时(例如,它是没有可用符号的第三方模块),WinDbg 将花费数小时来查找它们。
我已正确设置符号路径以正确设置搜索顺序和缓存目录:
.sympath cache*C:\SymbolCache1;\\our.corp\SymbolStore;SRV*C:\SymbolCache2*http://msdl.microsoft.com/download/symbols
跑步与!sym noisy
and .reload /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
通过跑步过程监控器 https://technet.microsoft.com/en-us/sysinternals/bb795533.aspx在它挂起的时候,我可以看到 WinDbg 正在搜索似乎是每个目录在我们巨大的网络符号存储 (\our.corp\SymbolStore) 中寻找符号,甚至在明显不相关的模块的目录中也是如此。
奇怪的是,在 WinDbg 中,您可以看到它提取了模块的时间戳 (0060D200cd1000),并使用它来查找本地目录和 MS 符号服务器中的预期位置。我不明白为什么它要对我们的(大规模)网络符号存储进行全面扫描。也许它处理 UNC 路径的方式有一些独特之处?
此搜索每个符号可能需要 15 分钟或更长时间,如果转储中有许多丢失的符号,则可能会导致!analyze -v
需要几个小时(如果您使用 WinDbg 的 Visual Studio 集成,一旦加载故障转储,就会导致挂起,因为由于某种原因,集成会尝试立即加载所有符号,尽管.symopt
设置)。
如果您尝试加载不存在的虚构模块名称的符号,例如,这个问题也很容易重现。.reload /f bogus.dll
.
这是我的 WinDbg .symopt 设置:
0:000> .symopt
Symbol options are 0x30337:
0x00000001 - SYMOPT_CASE_INSENSITIVE
0x00000002 - SYMOPT_UNDNAME
0x00000004 - SYMOPT_DEFERRED_LOADS
0x00000010 - SYMOPT_LOAD_LINES
0x00000020 - SYMOPT_OMAP_FIND_NEAREST
0x00000100 - SYMOPT_NO_UNQUALIFIED_LOADS
0x00000200 - SYMOPT_FAIL_CRITICAL_ERRORS
0x00010000 - SYMOPT_AUTO_PUBLICS
0x00020000 - SYMOPT_NO_IMAGE_SEARCH
我四处寻找,认为必须有一些标志来控制它,但我似乎找不到它。
有几件事:
- 这不是网络速度或缺少本地符号缓存的问题。该问题仅出现在找不到符号的情况下,并且仅出现在 UNC 符号存储中(例如,不适用于 Microsoft 符号服务器)
- 我已经尝试过 SYMOPT_NO_PUBLICS 而不是 SYMOPT_AUTO_PUBLICS
- 我已经使用以下命令验证了我的符号路径是否符合我的预期
sympath
命令。我也尝试过使用_NT_SYMBOL_PATH
而是环境变量。
- 我知道我可以通过配置文件排除某些符号,但这不是一个可行的解决方案,因为有时事先不知道丢失的符号名称
- 我在互联网上看到其他人也遇到了同样的问题,并在 Microsoft 论坛上的一篇题为“”但没有得到任何帮助。