在Visual Studio中debugging和发布有什么区别?

在.NET中可能重复debuggingVisual Studio版本

在Visual Studio中debugging和发布有什么区别?

最重要的是在Debug模式下没有优化,而在Release模式下有优化。 这很重要,因为编译器是非常先进的,可以做一些相当棘手的低级别的代码改进。 结果,你的代码中的某些行可能会在没有任何指令的情况下离开,或者有些行可能会混淆在一起。 逐步debugging是不可能的。 此外,局部variables通常以神秘的方式进行优化,所以手表和QuickWatches通常不会工作,因为variables是“优化的”。 还有许多其他的优化。 尝试debugging优化的.NET代码,你会看到。

另一个关键的区别是,由于这个原因,默认的发布设置不会生成广泛的debugging符号信息。 这是您可能已经注意到的.PDB文件,它允许debugging器找出哪些汇编指令声明了哪些代码行等等。

“debugging”和“发布”实际上只是整个设置的两个标签,可能会影响您的构build和debugging。

在“debugging”模式中,通常有以下几种:

  • 程序debugging数据库文件,它允许您在运行时在源代码中紧密跟踪程序的执行。
  • 所有优化closures,这使您可以检查variables的值,并跟踪到可能已被优化了或function的函数
  • 一个_DEBUG预处理器定义,允许您编写在debugging模式下与发行版相比具有不同行为的代码,例如,用于在debugging时仅使用ASSERT
  • 链接到已经编译了debugging选项的库,这些库通常不会被部署到实际的客户(由于大小和安全性的原因)

在“发布”模式下,开启了优化(虽然有多个选项可用),并且未定义_DEBUG预处理器定义。 通常情况下,您仍然需要生成PDB文件,因为在运行速度更快的情况下,能够在发布模式下进行“debugging”非常有用。

大多数情况下,debugging时会包含很多有用的信息。 在发布模式下,这一切都被削减和交易的性能。

如果你通过项目编译选项并比较它们,你会看到有什么区别。

假设这个问题是关于native / C ++代码的(这个问题并不完全清楚):

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

可能值得一提的是非常明显的是,构build标志允许使用不同的逻辑来改变日志logging和“控制台”消息传递,但是可以被滥用,并且不仅仅是低级的,而是实际的业务逻辑。

另外请注意,当使用MFC例如,debugging项目链接对像MFC90D.DLL非可再发行的DLL版本,而发布版本链接像MFC90.DLL的可再发行版本。 这可能与其他框架类似。

因此,您可能无法在非开发机器上运行debugging生成应用程序。

此外,显然,debugging模式会创build大量额外的线程来帮助进行debugging。 无论您是否附加debugging器,这些过程在整个过程中都保持活跃。 在这里看到我的相关问题。

你可以看到明显的差异是二进制文件的大小。 debugging版本产生比发布版本更大的二进制文件。

在Debug中编译时,符号表被添加到代码文件的编译对象中,允许debugging程序访问这些二进制文件并评估对象和variables的值。

另一个显而易见的区别是,在释放模式下,二进制文件只会在debugging模式下发生致命错误,如果您在Visual Studio中开始debugging应用程序,则可以检查调用堆栈,告诉您错误语句的确切位置。

当我开发一个从现有的发行版本configuration复制的应用程序时,我也对这个问题感到好奇。 我有一个在debugging模式下使用该应用程序很有趣的开发人员,所以我想知道如何使这个构buildconfiguration存在,并且从发布configuration中复制ReleaseMyBuild的名称(因此应该有所有的设置,以便释放优化)突然改变团队,并成为一个debugging版本,尽pipe令人困惑的构buildconfiguration名称。 我觉得项目configuration只是一个名字和一个方便的方式来select“整个摆设”Joris Timmermans提到。 我想知道这些设置可能是什么使得一个名为“FOO”的构buildconfiguration作为一个优化的发布构build的基本内容。

这里有一个窥探,我从VS2010的空项目模板创build了一个新的VCXPROJ。 然后,我复制它并编辑两者,第一个保留debugging内容,第二个发布内容。 这里的差异集中在相关的差异… 清空VCXPROJs调试与释放差异

发布

 <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。

我不知道确切的区别是什么,因为实际上没有任何信息可以轻易获得。

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

可悲的是,你必须把生产debugging版本。 是的,发布你必须使用良好的旧FTP。