Visual Studio应用程序在调试时运行极慢 我有一个本地C++程序,它在调试时(F5)运行速度慢了20倍,但是在使用启动时没有正常调试(Ctrl +F5)。

Visual Studio应用程序在调试时运行极慢 我有一个本地C++程序,它在调试时(F5)运行速度慢了20倍,但是在使用启动时没有正常调试(Ctrl +F5)。,c++,visual-studio-2010,visual-studio,debugging,C++,Visual Studio 2010,Visual Studio,Debugging,我使用的是调试版本还是发布版本并不重要。另外,如果我使用WinDbg,程序会慢一点 P>调试的C++有很多开销,尤其是在STL。尝试不定义\u DEBUG,并定义NDEBUG如果在IDE之外运行调试构建,则有几种情况是不同的。一个是IDE需要一段时间来加载符号,如果您依赖于很多库,那么启动时间可能非常长 如果您使用的是符号服务器(包括Microsoft公共符号服务器),则这可能会增加启动时间,因此请确保在\NT\u symbol\u PATH变量中有本地符号缓存(如果是这种情况) 此外,IDE

我使用的是调试版本还是发布版本并不重要。另外,如果我使用WinDbg,程序会慢一点


<> P>调试的C++有很多开销,尤其是在STL。尝试不定义
\u DEBUG
,并定义
NDEBUG

如果在IDE之外运行调试构建,则有几种情况是不同的。一个是IDE需要一段时间来加载符号,如果您依赖于很多库,那么启动时间可能非常长

如果您使用的是符号服务器(包括Microsoft公共符号服务器),则这可能会增加启动时间,因此请确保在
\NT\u symbol\u PATH
变量中有本地符号缓存(如果是这种情况)


此外,IDE在启用调试堆的情况下运行,但我认为如果在IDE之外运行,则不会发生这种情况。

这当然不是由于定义了调试符号或在调试配置中编译代码造成的。无论调试器是否附加到程序,添加的调试代码都会运行

调试器通常不会影响代码执行,它会通过调用WaitForDebugEvent来避免影响。这会阻止它,直到操作系统告诉它发生了值得注意的事情。这可能会触发调试器中的一堆代码,从而降低程序的速度。您可以看到DEBUG_事件结构文档中列出的事件

对它们的注释超出了文档的范围:调试器会介入,并在以下情况下降低程序的速度:

  • 程序加载或卸载DLL。加载期间会发生很多事情,调试器会查找调试符号文件(.pdb)。它可能会联系符号服务器进行下载。在DLL源代码中设置的任何断点都将被激活。这可能相当慢,但效果是暂时的,通常只会减慢启动速度。您可以在输出窗口中看到加载/卸载通知

  • 该程序引发了一个异常。这会在引发异常时激活调试器,即“第一次机会通知”。这可能非常有用,您可以使用Debug+Exception,shown复选框在引发异常时使调试器停止。您可以在输出窗口中看到通知消息。这确实会大大降低引发和捕获异常的代码的速度,而且很可能是导致速度减慢的原因。不要将异常用于流控制

  • 线程开始运行或终止。同样,通知消息被打印到输出窗口。您必须创建大量线程才能使其降低程序的速度

  • 当程序使用OutputDebugString()进行跟踪时。在输出窗口中可见。另一个很好的减速候选,如果没有附加调试器,输出将落在位存储桶中。您在诊断原因时应该不会遇到任何问题,明显的副作用是在输出窗口中看到大量消息

  • 当程序遇到断点时。没有太多的理由被这个问题难倒。但是,您可以设置断点,使程序速度大大降低,但不会导致调试器中断。特别是条件断点、命中计数器、筛选器和When-Hit操作会很慢。使用Debug+Windows+断点查看已定义的断点


将_NO_DEBUG_HEAP环境变量设置为1(如上所示)

这也可以从VisualStudio内部完成


现在这只是一个解决方法,我很想知道如何重构一个遭受此类问题困扰的程序。您是否有许多std::map、shared_ptr或任何其他大的间接指令?

没有人提到关闭未使用的源窗口


关闭20多个未使用的窗口后,调试源步骤从~5s返回到~2s。这个异常缓慢的项目动态加载一个DLL,而该DLL也是正在逐步执行的DLL(并且打开了源窗口),因此它看起来很可能是相关的。但是,这是C#(标题和标记是非特定的)。

在调试器下创建进程时,默认情况下操作系统使用调试堆。调试堆对内存进行更多的验证,尤其是在反分配时

有几个可能的选项可以禁用调试堆的使用:

  • 启动后立即连接到进程。这将使您能够在调试模式下提高性能,并完全了解运行模式

  • 添加环境变量设置\u NO\u DEBUG\u HEAP=1。
    这可以为计算机全局设置,也可以为Visual Studio的特定实例设置

    a。在全局范围内,您可以通过控制面板设置环境变量→ 系统→ 高级系统设置→ 环境变量,并在其中添加变量\u NO\u DEBUG\u HEAP=1。
    注意:这将对您调试的每个应用程序产生影响

    b。对于Visual Studio实例,可以打开命令提示符,将环境变量_NO_DEBUG_HEAP设置为1,然后从该命令提示符内部打开Visual Studio。这将仅影响从中创建的流程 Visual Studio的该实例将继承环境 变数

  • 附加调试器的行为,这对于VS2015是可能的。有两种方法可以覆盖此选项:

    a。要修改特定项目,请转到项目属性配置属性→ 调试并将环境属性\u NO\u DEBUG\u HEAP更改为1

    b。对莫