WinDbg 应该如此缓慢吗?

Is WinDbg supposed to be so excruciatingly slow?

我正在尝试分析一些小型故障转储。我正在使用 Windows 10 Pro Build 1607 和 WinDbg 10.0.14321.1024。我将我的符号文件路径设置为

SRV*C:\SymCache*https://msdl.microsoft.com/download/symbols

基本上,每当我加载一个小型转储(所有小于 1 MB 的 .dmp 文件)时,WinDbg 都会永远分析它们。我知道第一个 运行 可能需要很长时间,但我花了将近 12 个小时才让我输入命令。我假设,由于符号已缓存,因此重新打开相同的 .dmp 根本不会花很长时间。不是这种情况。它会加载,几乎立即进入 "Loading Kernel Symbols",然后又需要 30 分钟才能打印出 "BugCheck" 行。又过了30分钟,还是无法输入指令

我的电脑有 512 GB SSD、8 GB RAM 和 i5-4590。我觉得不应该这么慢。

我做错了什么?

这是符号服务器真的慢。其他人也注意到了:https://twitter.com/BruceDawson0xB/status/772586358556667904

您的符号路径包含一个本地缓存,因此下次它应该加载得更快,但似乎缓存无效,我不知道为什么(我怀疑下载的符号不是完美匹配并且每次都会再次下载它们)。

我建议将 _NT_SYMBOL_PATH(或您的 sympath 的初始化方式)修改为仅 SRV*C:\SymCache,即。不要尝试自动下载,只需使用您已经在本地缓存的符号。图像应该打开得相当快。只有在发现缺少符号时才启用符号服务器。

最近这类投诉似乎比较频繁,我可以在我的电脑上重现。这不是您的错,而是 Internet 或 Microsoft 端的符号服务器存在问题。

使用 Wireshark 监控流量并查看我的磁盘以了解如何填充符号缓存,我可以说:

  • 一次只下载一个文件。
  • 旧的 WinDbg 版本 (6.2.9200) 也会出现此问题
  • HTTP 和 HTTPS 出现问题
  • 当找到符号时,传输速度很慢,然后增加。有效传输速率从 11 kb/s 下降到 20 kb/s(在一条可以处理 6500 kb/s 的线路上)
  • 有相当多的数据包乱序、重复数据包等,特别是在 "lookup phase" 期间还没有文件下载。这样的查找阶段很容易花费 8 分钟。
  • 即使文件已经存在于磁盘上,也会执行"lookup phase"。
  • HTTP 往返时间(请求到响应)为 8 到 9 秒

我运行进入了同样的问题(windbg极慢),但是loading/reloading/fixing/caching符号没有帮助。偶然地,我发现当我尝试使用从寄存器中获取的地址打印内存时,这个问题仍然存在,比如

db rax 

经验法则是始终使用 @ 和寄存器名称。

db @rax 

没有这个符号,调试器认为rax是一个符号名,并查找它一段时间(取决于你加载的符号数量),但找不到它最终,然后退回到将其视为注册名称。使用 @ 符号从寄存器中打印内存会立即生效,即使您在内存中加载了大量符号。如您所见,此问题也与符号相关,但方式不同。