Visual Studio中的Debug和Release有什么区别?

时间:2008-12-15 09:45:59

标签: .net visual-studio

  

可能重复   Debug Visual Studio Release in .NET

Visual Studio中Debug和Release有什么区别?

12 个答案:

答案 0 :(得分:105)

最重要的是,在调试模式下没有优化,而在发布模式下则有优化。这很重要,因为编译器非常先进,可以对代码进行一些非常棘手的低级改进。因此,您的代码中的某些行可能会在没有任何指令的情况下离开,或者某些行可能会混淆。逐步调试是不可能的。此外,局部变量通常以神秘的方式进行优化,因此Watches和QuickWatches通常不起作用,因为变量是“优化掉的”。并且还有许多其他优化。尝试调试优化的.NET代码,你会看到。

另一个关键区别在于,因此默认的Release设置不会产生大量的调试符号信息。这是您可能已经注意到的.PDB文件,它允许调试器确定哪些汇编指令与哪行代码相对应等等。

答案 1 :(得分:47)

“Debug”和“Release”实际上只是可以影响构建和调试的一系列设置的两个标签。

在“调试”模式下,您通常具有以下内容:

  • 编程调试数据库文件,允许您在运行时在源中非常密切地执行程序。
  • 关闭所有优化,允许您检查变量的值并跟踪可能已经优化或内联的函数
  • 一个_DEBUG预处理器定义,允许您编写在调试模式下与发布模式不同的代码,例如,仅用于调试时应该使用的ASSERT
  • 链接到已经使用调试选项编译的库,这些库通常不会部署到实际客户(出于大小和安全性的原因)

在“释放”模式下,将启用优化(尽管有多个选项可用),并且未定义_DEBUG预处理器定义。通常,您仍然希望生成PDB文件,因为当事情运行得更快时能够在发布模式下“调试”非常有用。

答案 2 :(得分:8)

大多数情况下,调试包含许多在调试时有用的额外信息。在发布模式下,这一切都被削减并交易以获得性能。

答案 3 :(得分:7)

如果您浏览项目编译选项并进行比较,您会看到有什么不同。

假设问题是关于本机/ C ++代码(从措词中不完全清楚):

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

答案 4 :(得分:6)

值得一提的是,很明显,构建标志允许使用 仅用于更改日志记录和“控制台”消息传递的不同逻辑,但可以被滥用并且不仅极大地改变了低级别,而且改变了实际的业务逻辑。

答案 5 :(得分:6)

另请注意,例如,在使用MFC时,调试项目链接到不可再发行的DLL版本(如MFC90D.DLL),而发布版本链接针对可再发行版本,如MFC90.DLL。 这可能与其他框架类似。

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

答案 6 :(得分:6)

另外,显然,Debug模式会创建许多额外的线程来帮助调试。无论是否附加调试器,它们在整个过程中都保持活动状态。请参阅我的相关问题here

答案 7 :(得分:3)

您可以看到的明显差异是二进制文件的大小。 Debug构建产生比Release版本更大的二进制文件。

在Debug中编译时,符号表被添加到代码文件的编译对象中,这允许调试程序利用这些二进制文件并评估对象和变量的值。

另一个可观察的区别是,在Release模式下,二进制文件只会在调试模式下发生致命错误,如果您在Visual Studio中开始调试应用程序,则可以检查调用堆栈,它会告诉您确切的位置错误的陈述。

答案 8 :(得分:3)

当我开发从现有版本构建配置复制的应用程序时,我对这个问题也很好奇。我有一个开发人员有兴趣在调试模式下使用该应用程序,所以我想知道如何使这个构建配置存在,其名称为ReleaseMyBuild从Release配置中复制(因此应该具有适合发布优化的所有设置) )尽管令人困惑的构建配置名称,突然改变团队并成为调试版本。我认为项目配置只是一个名称和方便的方式来选择"整个设置" Joris Timmermans提到。我想知道这些设置可能会使构建配置命名为" FOO"的细节。作为优化的发布构建。

在这里,我从VS2010的空项目模板中创建了一个新的VCXPROJ。然后我复制它并编辑它们,第一个保留调试内容,第二个保存发布内容。这里的差异集中在相关的差异上...... Empty VCXPROJs Debug vs Release diff

<强> RELEASE

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

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

<强> DEBUG

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

<ClCompile>
    <Optimization>Disabled</Optimization>

有趣的是,在链接部分,他们都将GenerateDebugInformation设置为true。

答案 9 :(得分:0)

在调试配置中,您的程序使用完整的符号调试进行编译 信息,没有优化。优化使调试复杂化, 因为源代码和生成之间的关系 指令更复杂。

程序的发行版配置没有符号调试 信息,并经过充分优化。对于托管代码和C ++代码, 调试信息可以在.pdb文件中生成,具体取决于 使用的编译器选项。创建.pdb文件可能会有用 您以后必须调试发行版本。

参考Microsoft analytics_codelab.js

答案 10 :(得分:0)

在调试配置中,您的程序使用完整的符号调试信息进行编译,没有进行优化。优化使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。

您程序的发布配置没有符号调试信息,并且已经过全面优化。对于托管代码和 C++ 代码,可以在 .pdb 文件中生成调试信息,具体取决于使用的编译器选项。如果您以后必须调试发布版本,创建 .pdb 文件会很有用。

答案 11 :(得分:-11)

我不知道确切的差异是什么,因为实际上根本没有可用的信息。

但主要观察到的差异是发布版本有时会破坏生成的DLL文件,从而使应用程序,Web应用程序无法使用。

可悲的是,你必须将调试版本投入生产。是的,要发布你必须使用好的旧FTP。