在.NET中debugging与释放

从我以前的问题继续,是否有一个全面的文档,列出了在C#应用程序,特别是在Web应用程序的debugging和发布模式之间的所有可用的区别?

那里有什么分歧?

“Debug”和“Release”只是Visual Studio定义的预定义项目configuration的名称。
要查看差异,请查看Visual Studio中“项目属性”中的“生成”选项卡。

VS2005的差异包括:

  • debuggingconfiguration中定义的DEBUG常量

  • 优化发布configuration中启用的代码

以及通过单击“高级”button可以看到的其他差异

但是你可以:

  • 在Project Propeties / Build中更改“debugging”和“发布”configuration的构build设置

  • 通过右键单击解决scheme资源pipe理器中的解决scheme并selectConfiguration Manager来创build您自己的自定义configuration

我认为DEBUG常量的行为是相当清楚的(可以在#if预处理器指令或ConditionalAttribute中引用)。 但是我并没有意识到任何关于启用优化的全面文档 – 事实上,我怀疑微软希望可以自由地在不事先通知的情况下增强其优化器

没有一个文件列出差异。 除了已列出的一些差异外,以“debugging”模式进行编译会closures大多数在运行时执行的JIT编译器优化,并且会在符号数据库文件(.pdb)中发出更完整的debugging信息。

另一个很大的区别是,GC行为有些不同,因为JIT编译器会根据需要插入对GC.KeepAlive()的调用以支持debugging会话。

我不知道一个简洁的文件,但是:

  • Debug.Write调用在Release中被删除
  • 在Release中,由于优化,您的CallStack可能看起来有点“奇怪”,正如Scott Hanselman所述

debugging和发布只是不同解决schemeconfiguration的标签。 你可以添加其他人,如果你想。 如果您希望可以从configurationpipe理器添加更多configuration,

http://msdn.microsoft.com/en-us/library/kwybya3w.aspx

主要分歧 –

1.在debuggingDLL中添加了几个额外的指令,使您可以在Visual Studio中的每个源代码行上设置断点。 此外,代码将不会被优化,使您能够debugging代码。 在发行版本中,这些额外的说明被删除。

2.PDB文件仅在debugging模式下创build,而不是在重新分配模式下创build。

3.在发行模式中,cpde由内置于JIT编译器中的优化器进行优化。 它进行了以下优化:

•方法内联 – 方法调用被注入方法的代码所取代。

•CPU寄存器分配 – 局部variables和方法参数可以保持存储在CPU寄存器中,而无需(或不太频繁)存储回堆栈帧

•数组索引检查消除 – 使用数组时,一个重要的优化(所有.NET集合类都在内部使用数组)。 当JIT编译器可以validation循环从不索引数组越界时,它将消除索引检查。

• Loop unrolling - Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. • Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. • Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop. • Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x 

一个主要的性能领域,如果您使用任何ASP.NET Ajax控件:debugging信息从JavaScript库中删除,当在发行版中运行时,我已经看到在复杂页面上的主要性能改进。 其他基于Web的资源可能会基于此设置被caching或不被caching。

另外,请记住,Web应用程序中的debugging/发布由web.config文件决定,而不是Visual Studio中的设置。

 <system.web> <compilation debug="true"> 

更多信息:

  • 不要运行启用了debug =“true”的生产ASP.NET应用程序

在debugging模式下使用GDI +进行绘图相当慢。

您还可以pipe理一部分仅在debugging中运行的代码,或者仅在具有预处理器标记的版本中运行代码:

  #if DEBUG // Some code running only in debug #endif 

要么

  #if NOT DEBUG // Some code running only in release #endif 

发行版本:

  1. 是相当快(最重要),优化

  2. 不能被打败(一步一步)

  3. 不包括用“debug”指令编写的代码

看看debugging与发布版本有什么区别?

当我将可执行文件分发到另一台机器时,我收到一条错误消息,指出系统错过了MSVCP110D.dll。

这个问题的解决方法是在堆栈溢出问题中声明Visual Studio MSVCP110D.dll丢失

IN XXXXD.dll D表示DLL文件是DLL文件的debugging版本。 但MS Visual C ++可再发行组件包仅包含DLL文件的发行版本。

这意味着,如果您需要分发由Visual C ++开发的程序 ,则需要在Release模式下构build它。 而且你还需要在目标机器上安装MS Visual C ++ Redistributable(正确的版本)。

所以我认为这是debugging和发布模式之间的主要区别之一。