WinDbg在调试本地进程时非常缓慢(单步跳过)

3
这真的让我发疯了。我正在使用WinDbg作为我的主要调试器。 它用于调试本地服务(WinDbg在本地运行,调试同一台机器上的服务)。 PDB文件存储在本地硬盘上。 通过SMB共享访问源代码。
调试工作时有时会流畅进行,大部分时间我都会看到令人难以置信的烦人的“* BUSY *”消息,这几乎每次执行“步出”操作时都会发生。
有什么想法可以加速调试吗?
谢谢

我不确定,但我会使用进程监视器来查看WinDbg在冻结时是否正在进行某些IO工作。如果是这样,那可能是问题根源的一个好提示。此外,如果您从Microsoft的服务器获取PBD,请尝试禁用它。如果由于某种原因WinDbg无法将PBD本地保存,则可能每次都要到服务器上进行操作。 - Eran
检查您是否同时有过多的BP活动; 另外,开启嘈杂模式以检查是否实际上只引用了本地符号。 - deemok
你设置了符号路径环境变量吗?如果是的话,WinDbg将使用它。从Microsoft获取PDB可能会显著减慢速度。 - Brian Rasmussen
7个回答

1
我遇到了完全相同的问题,并通过调整符号选项看到了很大的改进。具体来说,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

1
这可能是因为您的工作区保存了许多通过bu创建的跟踪模块加载事件的不合格断点。
此外,值得检查网络连接和本地符号缓存大小。

0

0

不要使用“步过(step-over)”命令,而应该在下一条指令处设置一个断点,甚至可以使用硬件断点(ba)。


0
通常这种情况发生在打开了多个工具窗口(本地变量、监视、调用堆栈)的时候。如果这些窗口已经打开,WinDbg 将花费时间用慢速符号查找更新它们中的所有窗口,每次“步过”命令都会更新一次。
在这方面,使用仅有命令行 ( ntsd ) 调试器会更快。

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

0

有几件事情可以尝试:

  • 使用!sym noisy命令显示windbg所引用的图像和pdb文件的更详细信息。您可能会发现它正在访问比您预期更多的网络,或者某个网络服务器不可用并且请求超时。
  • 确保您的符号路径中有缓存
  • 将源代码复制到本地并添加到源路径中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接