Visual C ++:在发布模式下启动/不启动调试之间的区别

时间:2010-07-29 09:07:35

标签: visual-studio debugging visual-c++ release

开始调试( F5 无需调试启动( CTRL - F5 代码是在发布模式下编译

对于某些C ++代码,我看到 CTRL - F5 F5 快10倍。如果我没有错,调试器将附加到 F5 的执行过程,而不是 CTRL - F5 。由于这是Release模式,编译后的代码没有任何调试信息。所以,如果我没有任何断点,两者的执行时间应该相同,不是吗?!

(假设Release和Debug模式是您在创建新的Visual C ++项目时获得的典型配置。)

4 个答案:

答案 0 :(得分:17)

问题是如果Windows检测到您的程序在调试器下运行,则会在特殊的Debug Heap中出现问题。这似乎发生在操作系统级别,并且与编译的任何调试/发布模式设置无关。

您可以通过设置环境变量来解决此“功能”:_NO_DEBUG_HEAP = 1

同样的问题让我疯了一会儿;今天我找到了以下内容,从这篇文章中衍生出来: http://blogs.msdn.com/b/larryosterman/archive/2008/09/03/anatomy-of-a-heisenbug.aspx

答案 1 :(得分:7)

“无需调试即可启动”只是告诉Windows按正常运行的方式启动应用程序。

“从调试开始”启动VS调试器,让它在调试器中运行应用程序。

这与调试/发布版本设置没什么关系。

当您构建应用程序的默认“调试”配置时,您将对发布版本产生以下主要差异:

  • 发布的代码不会被优化,因此更容易调试,因为它更接近您的源
  • 编译器&链接器将输出一个包含大量额外信息的.PDB文件来帮助调试器 - 这些信息的存在与否对代码的性能没有影响,只是调试的简便性。
  • 像ASSERT和VERIFY这样的条件宏在发布版本中将是无操作,但在调试版本中是活动的。

这些项目中的每一项都是独立且可选的!您可以打开或关闭其中的任何一个或全部,并仍在调试器下运行代码,您将无法轻松找到生活。

当您运行'with debugging'时,由于以下几个原因,事情的表现会有所不同:

  • VS调试器的启动效率非常低,部分原因是因为VS中的所有内容都很慢 - 在VS2010之前的版本中,当IDE进入调试模式时,屏幕上的每个像素都会被重新绘制大约30次,闪烁和闪烁很多。 / LI>
  • 根据事物的配置方式,调试器可能会花费大量时间在启动时尝试为许多操作系统组件加载符号(即PDB文件) - 它们可能会尝试获取这些文件网络,在某些情况下可能需要一个年龄。
  • 您的应用程序通常执行的许多活动(加载DLL,启动线程,处理异常)都会导致调试程序被警告。这样既可以减慢速度,也可以使它们顺序运行。

答案 2 :(得分:4)

IsDebuggerPresent()OutputDebugString()的行为会有所不同,具体取决于是否附加了调试程序。

IsDebuggerPresent()只返回另一个值,因此您的程序可以对此值做出反应,并且有意地表现不同。当没有连接调试器时,OutputDebugString()返回的速度要快得多,所以如果多次调用它,你会发现程序在没有调试器的情况下运行得更快。

答案 3 :(得分:0)

运行'with debugging'时,即使是发布模式,也会使用调试堆。这会导致使用大量malloc / free或new / delete的代码严重减速,这可能发生在C ++代码中,而不会注意到它,因为库/类往往会隐藏这些内存管理内容。