开始调试( F5 )和无需调试启动( CTRL - F5 < kbd>)代码是在发布模式下编译?
对于某些C ++代码,我看到 CTRL - F5 比 F5 快10倍。如果我没有错,调试器将附加到 F5 的执行过程,而不是 CTRL - F5 。由于这是Release模式,编译后的代码没有任何调试信息。所以,如果我没有任何断点,两者的执行时间应该相同,不是吗?!
(假设Release和Debug模式是您在创建新的Visual C ++项目时获得的典型配置。)
答案 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调试器,让它在调试器中运行应用程序。
这与调试/发布版本设置没什么关系。
当您构建应用程序的默认“调试”配置时,您将对发布版本产生以下主要差异:
这些项目中的每一项都是独立且可选的!您可以打开或关闭其中的任何一个或全部,并仍在调试器下运行代码,您将无法轻松找到生活。
当您运行'with debugging'时,由于以下几个原因,事情的表现会有所不同:
答案 2 :(得分:4)
IsDebuggerPresent()
和OutputDebugString()
的行为会有所不同,具体取决于是否附加了调试程序。
IsDebuggerPresent()
只返回另一个值,因此您的程序可以对此值做出反应,并且有意地表现不同。当没有连接调试器时,OutputDebugString()
返回的速度要快得多,所以如果多次调用它,你会发现程序在没有调试器的情况下运行得更快。
答案 3 :(得分:0)
运行'with debugging'时,即使是发布模式,也会使用调试堆。这会导致使用大量malloc / free或new / delete的代码严重减速,这可能发生在C ++代码中,而不会注意到它,因为库/类往往会隐藏这些内存管理内容。