繁体   English   中英

Visual Studio应用程序在调试时运行速度极慢

[英]Visual Studio application running extremely slow with debug

我有一个本机C ++程序,它在启动DebugF5 )时运行速度慢了20多倍,但在使用start而不调试时运行正常( Ctrl + F5 )。

无论我是使用调试还是发布版本都没关系。 此外,如果我使用WinDbg,程序的速度会慢一些。

是否有一些设置我选择了错误或什么?

将_NO_DEBUG_HEAP环境变量设置为1(如http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger所示 )。

这也可以在Visual Studio内部完成。

现在这只是一个解决方法,我很想知道如何重构一个遭受这类问题的程序。 你有很多std :: map's,shared_ptr或任何其他大的间接吗?

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

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

在文档之外注释它们:调试器介入并在以下情况下减慢程序速度:

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

  • 该计划提出了一个例外。 这会在引发异常时激活调试器,即“第一次机会通知”。 这可能非常有用,您可以使用Debug + Exception,Thrown复选框使调试器在引发异常时停止。 您可以在“输出”窗口中看到通知消息。 确实会减慢代码,这会极大地提升和捕获异常,很可能是您减速的源头。 切勿使用异常进行流量控制。

  • 线程开始运行或终止。 同样,通知消息将打印到“输出”窗口。 你必须创建很多线程才能使你的程序变慢。

  • 当您的程序使用OutputDebugString()进行跟踪时。 在“输出”窗口中可见。 如果没有附加调试器,那么减速的另一个好选择是输出落在位桶中。 你应该没有任何问题将其诊断为原因,明显的副作用是在“输出”窗口中看到很多消息。

  • 当程序遇到断点时。 没有太多理由被那个难倒。 但是你可以设置断点来减慢程序的速度但不会导致调试器中断。 特别是条件断点,命中计数器,过滤器和命中时操作都会很慢。 使用Debug + Windows + Breakpoints查看定义的断点。

如果在IDE外部运行调试版本,则有几个不同的东西。 一个是IDE需要一段时间来加载符号,如果你依赖很多库,那么启动时间可能很大。

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

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

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

有几种可能的选项可以禁用Debug Heap:

  1. 启动后不久将附加到该过程。 这将使您能够有意识地加速调试模式下的性能,并充分了解您运行的模式。

  2. 添加环境变量设置_NO_DEBUG_HEAP = 1。
    这可以为机器或Visual Studio的特定实例全局设置。

    一个。 在全局范围内,您可以通过控制面板→系统→高级系统设置→环境变量设置环境变量,然后添加变量_NO_DEBUG_HEAP = 1。
    注意:这将对您调试的每个应用程序产生影响。

    对于Visual Studio的实例,您可以打开命令提示符,设置环境变量_NO_DEBUG_HEAP = 1,然后从该命令提示符中打开visual studio。 这将仅影响从该Visual Studio实例创建的进程将继承环境变量。

  3. 附加调试器的行为 ,这对于VS2015是可能的。 有两种方法可以覆盖它:

    一个。 要修改特定项目,请转到项目属性Configuration Properties→Debugging并将Environment属性_NO_DEBUG_HEAP更改为1

    要修改Visual Studio中的每个项目,请转到工具→选项→调试,然后选中选项:“启用Windows调试堆分配器(仅限本机)”。
    注意:如果'a'中提到的_NO_DEBUG_HEAP环境变量在项目级别设置,它将覆盖此全局设置。

对我来说,调试模式和发布模式之间的性能差异大约是40倍。 经过一些挖掘,看起来有几个因素导致性能上的差异,但有一个编译器选项几乎可以免费使我的调试性能翻两番

即,将/ZI改为/Zi 有关说明,请参阅MSDN页面

我还是不使用编辑和继续功能。

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

关闭20多个未使用的窗口后,调试源步进从~5s回到〜.2s。 这个异常缓慢的项目动态加载DLL,并且DLL也是正在逐步执行的(并且源窗口打开),因此它似乎可能相关。 然而,这是C#(标题和标签是非特定的)。

调试Visual C ++会带来大量的开销,特别是在STL中。 尝试不定义_DEBUG ,并定义NDEBUG

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM