.NET中的调试与发布

时间:2008-09-18 08:13:43

标签: c# .net asp.net

继续我的previous question,是否有一份全面的文档列出了C#应用程序中调试和发布模式之间的所有可用差异,特别是在Web应用程序中?

有什么不同?

9 个答案:

答案 0 :(得分:48)

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

VS2005的差异包括:

  • 调试配置中定义的DEBUG常量

  • 优化发布配置中启用的代码

以及点击“高级”按钮

可以看到的其他差异

但你可以:

  • 在Project Propeties / Build中更改Debug和Release配置的构建设置

  • 通过右键单击解决方案资源管理器中的解决方案并选择配置管理器

  • 来创建自己的自定义配置

我认为DEBUG常量的行为相当清楚(可以在#if预处理器指令或ConditionalAttribute中引用)。但我不知道有关确切启用哪些优化的全面文档 - 实际上我怀疑微软希望在没有通知的情况下自由地增强其优化器

答案 1 :(得分:15)

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

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

答案 2 :(得分:13)

我不知道一份简明的文件,但是:

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

答案 3 :(得分:9)

调试和发布只是不同解决方案配置的标签。如果需要,您可以添加其他人。如果您希望可以从配置管理器添加更多配置 -

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

主要差异 -

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

2.PDB文件仅在调试模式下创建,而不是在相关模式下创建。

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

•方法内联 - 方法调用由注入方法的代码替换。

•CPU寄存器分配 - 局部变量和方法参数可以保存在CPU寄存器中,而不会(或不经常)存储回堆栈帧

•数组索引检查消除 - 使用数组时的一个重要优化(所有.NET集合类在内部使用数组)。当JIT编译器可以验证循环从不索引数组超出范围时,它将消除索引检查。

•   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

答案 4 :(得分:5)

如果您正在使用任何ASP.NET Ajax控件,那么一个主要的性能区域:在发布版本中运行时,调试信息将从JavaScript库中删除,并且我已经看到复杂页面上的主要性能改进。其他基于Web的资源可以根据此设置进行缓存或不缓存。

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

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

更多信息:

答案 5 :(得分:4)

使用GDI +绘图在调试模式下要慢得多。

答案 6 :(得分:3)

您还可以管理您希望仅在调试中运行的代码的某些部分,或者仅在具有预处理器标记的版本中运行:

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

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

答案 7 :(得分:2)

发布版本:

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

  2. 不能(一步一步)

  3. 并且不包含用“debug”指令编写的代码

  4. 请参阅 What's the difference between a Debug vs Release Build?

答案 8 :(得分:1)

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

此问题的解决方案在Stack Overflow问题 Visual Studio MSVCP110D.dll is missing 中说明。

IN XXXXD.dll D表示DLL文件是DLL文件的调试版本。但MS Visual C ++ Redistributable软件包仅包含DLL文件的发行版本。

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

所以我认为这是调试和发布模式之间的关键区别之一。