在 VisualStudio 中调试和发布的区别是什么?

可能是复制品 在.NET 中调试 VisualStudio 发行版

在 VisualStudio 中调试和发布的区别是什么?

49241 次浏览

If you go through project compile options and compare them, you'd see what are the differences.

假设这个问题是关于原生/C + + 代码的(从措辞上看不是很清楚) :

基本上,在 Debug 中所有的代码生成优化都是关闭的。一些库(例如 STL)默认执行更严格的错误检查(例如调试迭代器)。生成更多的调试信息(例如“编辑并继续”)。在代码中生成了更多的东西来捕获错误(将局部变量值设置为未初始化的模式,并使用调试堆)。

大多数情况下,调试包含许多在调试时有用的额外信息。在发布模式下,这是所有削减和交易的性能。

值得一提的是,构建标志允许使用不同的逻辑,应该只是用来更改日志记录和“控制台”消息,但是 可以被滥用,并且不仅显著地改变了底层,而且改变了实际的业务逻辑。

还要注意,例如,当使用 MFC时,调试项目链接到非可再发行的 DLL 版本(如 MFC90D.DLL) ,而发布版本构建链接到可再发行的版本(如 MFC90.DLL)。 This is probably similar to other frameworks.

因此,您可能无法在非开发计算机上运行调试生成应用程序。

您可以看到的明显区别是二进制文件的大小。调试版本产生比发布版本更大的二进制文件。

在调试中进行编译时,将符号表添加到代码文件的编译对象中,从而允许调试程序进入这些二进制文件并访问对象和变量的值。

另一个可观察到的区别是,在发布模式下,在调试模式下,二进制文件会因为一个致命错误而崩溃,如果你在 Visual Studio 中开始调试应用程序,你可以检查调用堆栈,它会告诉你错误语句的确切位置。

最重要的是,在调试模式中没有优化,而在发布模式中有优化。这一点很重要,因为编译器非常先进,可以对代码进行一些非常棘手的低级改进。因此,代码中的一些行可能会完全没有指令,或者一些行可能会完全混淆。分步调试是不可能的。此外,局部变量通常以神秘的方式进行优化,所以 Watches 和 QuickWatches 通常不能正常工作,因为变量被“优化掉了”。还有许多其他的优化。尝试优化调试。NET 代码,你会看到。

另一个关键的区别是,因为这个原因,默认的发布设置不会生成大量的调试符号信息。这就是。您可能已经注意到了 PDB 文件,它允许调试器指出哪些汇编指令对应于哪行代码,等等。

“ Debug”和“ Release”实际上只是影响构建和调试的大量设置的两个标签。

在“调试”模式下,你通常会得到以下信息:

  • 程序调试数据库文件,它允许您在运行时非常密切地跟踪源代码中程序的执行。
  • 关闭所有优化,这允许您检查变量的值并跟踪到函数,否则这些函数可能已经被优化掉或内联了
  • 一个 _ DEBUG 预处理器定义,它允许您编写与发布版本相比在调试模式下行为不同的代码,例如用于检测只能在调试时使用的 ASSERT
  • Linking to libraries that have also been compiled with debugging options on, which are usually not deployed to actual customers (for reasons of size and security)

在“发布”模式下,优化是打开的(尽管有多个选项可用) ,并且没有定义 _ DEBUG 预处理器定义。不过,通常您仍然希望生成 PDB 文件,因为在运行速度更快的情况下,能够在发布模式下“调试”是非常有用的。

此外,显然,调试模式创建了许多额外的线程来帮助调试。无论是否附加调试器,它们在进程的整个生命周期中始终处于活动状态。见我的相关问题 给你

当我开发一个从现有的发布版本构建配置复制过来的应用程序时,我也对这个问题感到好奇。

我有一个开发人员,他对在调试模式下使用这个应用程序很感兴趣,所以我想知道怎样才能让这个名为 ReleaseMyBuild 的构建配置从一个发布配置复制过来(因此应该有所有针对发布优化的设置) ,然后突然改变团队,成为一个调试构建,尽管这个构建配置的名称令人困惑。

我认为项目配置只是一个名称,是选择 Joris Timmermans 提到的“整套设置”的一种方便的方法。我想知道的是,这些设置的本质可能是什么,使一个名为“ FOO”的构建配置功能作为一个优化的 释放构建。

让我们一窥究竟。我从 VisualStudio2010的空项目模板创建了一个新的 VCXPROJ。然后复制并编辑它们,第一个保留调试内容,第二个保留发布内容。这里的差异集中在相关的差异..。

Empty VCXPROJs Debug vs Release diff

释放

<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>


<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>

调试

<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`


<ClCompile>
<Optimization>Disabled</Optimization>

有趣的是,在 Link 部分,它们都将 GenerateDebugInformation设置为 true。

在调试配置中,程序使用完全符号调试进行编译 没有优化。优化使调试复杂化, 因为源代码和生成的 instructions is more complex.

The release configuration of your program has no symbolic debug 对于托管代码和 C + + 代码, 调试信息可以在.pdb 文件中生成,具体取决于 使用的编译器选项。如果 您以后必须调试您的发布版本。

参考微软 医生

In debug configuration, your program compiles with full symbolic debug information and no optimization. Optimization complicates debugging, because the relationship between source code and generated instructions is more complex.

程序的发行版配置没有符号调试信息,并且已经完全优化。对于托管代码和 C + + 代码,可以在。Pdb 文件,具体取决于所使用的编译器选项。创造。如果以后需要调试发布版本,pdb 文件可能非常有用。