【问题标题】:WinDbg slow when debugging local process (step over)调试本地进程时 WinDbg 速度慢(跳过)
【发布时间】:2011-11-10 02:20:49
【问题描述】:

这真的让我发疯了。我使用 WinDbg 作为我的主要调试器。 用于调试本地服务(WinDbg在本地运行,在同一台机器上调试服务)。 PDB 文件存储在本地硬盘上。 源代码通过 SMB 共享访问。

调试工作是突发的,有时它运行良好,大多数时候我一直看到令人难以置信的烦人的“*BUSY*”消息,几乎每次我执行“跨步”时都会发生这种情况。

有什么想法可以加快速度吗?

谢谢

【问题讨论】:

  • 我不知道,但我会使用进程监视器来查看 WinDbg 在冻结时是否忙于做一些 IO 工作。如果是这样,那可能是对问题根源的一个很好的暗示。此外,如果您从 Microsoft 的服务器获取 PBD,请尝试禁用它。如果由于某种原因 WinDbg 无法在本地保存 PBD,它可能每次都在访问服务器。
  • 检查是否同时有过多的 BPs 处于活动状态;另外,为符号启用噪声模式以检查您是否实际上只引用本地符号
  • 你设置了符号路径环境变量吗?如果是这样,WinDbg 将使用它。从 Microsoft 获取 PDB 可能会大大减慢速度。

标签: debugging windbg


【解决方案1】:

当您的符号路径包含大型文件存储时,WinDbg 可能会花费很长时间来搜索不存在的符号。正如用户 eran 所建议的那样,您可以通过运行 Process Monitor 并观察 WinDbg 进行的文件操作来诊断此行为。

这对我们的组织来说是一个极端的痛点,但我在这个问题中找到了一个详细的解决方法:“WinDbg takes extremely long time to loading symbols; is searching every directory in large network UNC symbol store

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,并且通过调整符号选项能够看到很大的改进。具体来说,SYMOPT_NO_PUBLICS 选项似乎是最重要的,但我调整了其他一些相关选项。我做了以下...

    .symopt-0x4 .symopt+0x100 .symopt+0x8000 .symopt-0x10000

    ...这是:

    -SYMOPT_DEFERRED_LOADS +SYMOPT_NO_UNQUALIFIED_LOADS +SYMOPT_NO_PUBLICS -SYMOPT_AUTO_PUBLICS

    毕竟,我有一个 symopt 位掩码值 0x80028333,我现在将其用作 WinDbg 命令行选项,如下所示:

    windbg.exe -sflags 0x80028333

    我还没有发现这种方法是否有任何缺点。也许在某些情况下使用 SYMOPT_NO_PUBLICS 会导致信息丢失,但到目前为止它对我来说效果很好,而且速度肯定更快。

    WinDbg Symbol Options MS Documentation

    【讨论】:

      【解决方案3】:

      不要使用“step-over”,而是在下一个命令上设置断点,甚至是硬件断点(使用 ba)

      【讨论】:

        【解决方案4】:

        如果您的工作区中保存了许多跟踪模块加载事件(通过 bu 创建)的不合格断点,则可能会发生这种情况。
        此外值得检查网络连接和本地符号缓存大小

        【讨论】:

          【解决方案5】:

          有几件事可以尝试:

          • 使用!sym noisy 命令显示有关windbg 引用的图像和pdb 的更多详细信息。您可能会发现它访问网络的次数超出了您的预期,或者网络服务器不可用且请求超时
          • 确保您的符号路径具有cache in it
          • 在本地复制源并添加到源路径

          【讨论】:

            【解决方案6】:

            如果它正在缓慢地从 Internet 中提取 Windows 符号文件,请考虑将它们全部下载到您的硬盘驱动器并将 WinDbg 指向它们在硬盘上的位置。最好将服务的符号文件和源文件也放在本地驱动器上。

            【讨论】:

              【解决方案7】:

              这通常发生在我打开多个工具窗口(locals、watches、call stack)时。如果打开了这些窗口,WinDbg 将花费周期来更新所有这些窗口,并在每个“跨步”命令上使用慢速符号查找。

              在这方面,仅使用命令行 (ntsd) 调试器要快得多。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-09-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-04-30
                • 2011-03-22
                相关资源
                最近更新 更多