在.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
发行版本:
-
是相当快(最重要),优化
-
不能被打败(一步一步)
-
不包括用“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和发布模式之间的主要区别之一。