为什么连接调试器的运行速度如此之慢?

时间:2012-03-06 22:22:12

标签: c++ visual-studio visual-studio-2010

与未连接相比,是什么导致调试版本与调试器连接得慢得多?它们都是同一个exe运行。

编辑:大多数答案都集中在断点上。我仍然像没有断点的泥浆,OutputDebugString或观察窗口中的任何东西一样运行。那么调试CRT,运行时堆栈检查和调试堆呢?

4 个答案:

答案 0 :(得分:8)

如果它不是OutputDebugString或者成堆的断点会减慢一切,请尝试以下方法:

  • Windows调试堆 - 如果调试堆在调试器下运行,您的进程将获得调试堆,不会有任何问题。要在Visual Studio调试器下运行时禁用此功能,请访问项目属性的调试页面并将_NO_DEBUG_HEAP=1添加到环境中。

    (Windows调试堆与CRT调试堆是分开的。如果它在调试器下运行,你的发布版本也将获得Windows调试堆。)

  • 程序加载了许多带符号的DLL。加载DLL时,Visual Studio会尝试为其查找符号。如果有可用的符号,这可能需要一些时间。除了重新排列你的程序以便它不经常加载DLL之外,你无能为力。

  • 检查对IsDebuggerPresent的任何调用 - 这可能会导致在调试器中运行和在调试器外运行之间存在任意差异。

(作为最后的一次性建议 - 我也会怀疑在调试过程时异常(无论是C ++还是结构化)可能会更多地涉及。所以如果你的程序投入很多,也许这可能有点在调试时速度较慢。)

答案 1 :(得分:3)

如果你的调试器使用软件观察点,它在内部执行代码并检查这些点和变量值的变化。

  

[VS]调试器只能支持4个硬件数据断点。如果你使用   表达式(a + b),调试器使用仿真模式。

此外,加载库的调试信息较慢,这有助于感知执行时间(响应时间)。

Reference

答案 2 :(得分:1)

您是否通过OutputDebugString进行了大量日志记录? OutputDebugString生成的输出由调试器接收,但在未在调试器下运行时被忽略。

答案 3 :(得分:1)

有几个原因可以解决为什么连接调试器运行速度明显慢于未连接调试器的原因。最可能的原因是

  • 过多的断点
  • 具有昂贵条件的断点
  • 跟踪点太多

首先要尝试的是禁用所有断点并查看效果如何执行