Visual Studio中Debug和Release有什么区别?
答案 0 :(得分:105)
最重要的是,在调试模式下没有优化,而在发布模式下则有优化。这很重要,因为编译器非常先进,可以对代码进行一些非常棘手的低级改进。因此,您的代码中的某些行可能会在没有任何指令的情况下离开,或者某些行可能会混淆。逐步调试是不可能的。此外,局部变量通常以神秘的方式进行优化,因此Watches和QuickWatches通常不起作用,因为变量是“优化掉的”。并且还有许多其他优化。尝试调试优化的.NET代码,你会看到。
另一个关键区别在于,因此默认的Release设置不会产生大量的调试符号信息。这是您可能已经注意到的.PDB文件,它允许调试器确定哪些汇编指令与哪行代码相对应等等。
答案 1 :(得分:47)
“Debug”和“Release”实际上只是可以影响构建和调试的一系列设置的两个标签。
在“调试”模式下,您通常具有以下内容:
在“释放”模式下,将启用优化(尽管有多个选项可用),并且未定义_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)
在这里,我从VS2010的空项目模板中创建了一个新的VCXPROJ。然后我复制它并编辑它们,第一个保留调试内容,第二个保存发布内容。这里的差异集中在相关的差异上......
<强> 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。