若要查看差异,请在Visual Studio的"项目属性"中查看"生成"选项卡。VS200"/>

关于C#:. NET中的调试与发布

关于C#:. NET中的调试与发布

Debug vs. release in .NET

继续我的上一个问题,是否有详尽的文档列出了C#应用程序(尤其是Web应用程序)中调试和发布模式之间的所有可用差异?

有什么区别?


"调试"和"发布"仅是Visual Studio定义的预定义项目配置的名称。
若要查看差异,请在Visual Studio的"项目属性"中查看"生成"选项卡。

VS2005中的差异包括:

  • 在调试配置中定义的DEBUG常数

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

以及通过单击"高级"按钮可以看到的其他差异

但是你可以:

  • 在项目属性/构建中更改调试和发布配置的构建设置

  • 通过在解决方案资源管理器中右键单击解决方案并选择配置管理器来创建自己的自定义配置

我认为DEBUG常量的行为非常清楚(可以在#if预处理程序指令或ConditionalAttribute中引用)。但是我不知道有关启用了哪些优化的任何全面文档-实际上,我怀疑Microsoft会希望自由地增强其优化器,而不另行通知


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

另一个很大的不同是,GC行为有所不同,因为JIT编译器将适当/需要插入对GC.KeepAlive()的调用以支持调试会话。


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

  • Debug.Write调用在Release中被剥离
  • 在发行版中,由于优化,您的CallStack可能看起来有些"奇怪",正如Scott Hanselman概述的那样

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

http://msdn.microsoft.com/zh-CN/library/kwybya3w.aspx

主要差异–

1.在调试dll中,添加了一些额外的说明,使您可以在Visual Studio中的每个源代码行上设置断点。同样,代码也不会被优化,从而使您能够调试代码。
在发行版本中,这些额外的说明已删除。

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

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

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

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

?消除数组索引检查-使用数组时的一项重要优化(所有.NET集合类在内部使用数组)。当JIT编译器可以验证循环是否永不对数组进行索引时,它将消除索引检查。

1
2
3
4
5
6
7
?   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控件,则是一个主要的性能方面:在发行版中运行时,调试信息已从JavaScript库中删除,并且我已经看到了复杂页面上的主要性能改进。基于此设置,可以缓存或不缓存其他基于Web的资源。

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

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

更多信息:

  • 不要在启用debug =" true"的情况下运行生产ASP.NET应用程序

在调试模式下,使用GDI +进行绘制要慢得多。


您还可以管理只在调试中或仅在带有预处理器标记的发行版中运行的部分代码:

1
2
3
 #if DEBUG
    // Some code running only in debug
 #endif

要么

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

发布版本:

  • 相当快(最重要),已优化

  • 无法调试(逐步)

  • 并且不包含用" debug"指令编写的代码

  • 请参阅调试版本与发行版本之间有什么区别?


    将可执行文件分发到另一台计算机时,出现错误消息,指示系统缺少MSVCP110D.dll。

    缺少堆栈溢出问题Visual Studio MSVCP110D.dll中说明了此问题的解决方案。

    在XXXXD.dll中,D表示DLL文件是DLL文件的调试版本。但是,MS Visual C ++可再发行组件包仅包含DLL文件的发行版。

    这意味着,如果需要分发由Visual C ++开发的程序,则需要在发布模式下进行构建。另外,您还需要在目标计算机上安装MS Visual C ++ Redistributable(正确版本)。

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


    推荐阅读

      linux移动文档命令?

      linux移动文档命令?,文件,名称,系统,位置,目录,信息,命令,源文件,目标,文件

      linux内核配置命令?

      linux内核配置命令?,工作,系统,管理,环境,信息,命令,工具,软件,设备,服务,调

      linux进入配置的命令?

      linux进入配置的命令?,网络,地址,服务,系统,状态,工作,信息,技术指标,最新,

      linux下进程调试命令?

      linux下进程调试命令?,系统,工作,软件,信息,命令,基础,地址,状态,进程,实时,L

      linux命令文档下载?

      linux命令文档下载?,工具,网络,系统,工作,基础,数据,名称,管理,位置,代理,lin

      linux配置网络命令?

      linux配置网络命令?,系统,地址,工作,网络,代码,信息,工具,名字,设备,命令,lin

      linux命令行模式网络?

      linux命令行模式网络?,网络,基础,系统,服务,管理,工作,命令,信息,中级,设备,l

      linux网口调试命令?

      linux网口调试命令?,系统,工作,地址,信息,网络,技术指标,状态,电脑,命令,网

      linux命令行模式登录?

      linux命令行模式登录?,系统,密码,信息,状态,情况,终端,环境,管理,电脑,位置,l

      linux退出命令模式?

      linux退出命令模式?,状态,档案,命令,环境,密码,终端,文件,模式,编辑,端口,lin

      linux命令模式加行?

      linux命令模式加行?,工作,地址,系统,命令,工具,正规,信息,时间,第一,模式,Lin

      linux命令行模式使用?

      linux命令行模式使用?,工作,地址,目录,信息,名称,系统,管理,命令,文件,标准,l

      linux命令chm文档?

      linux命令chm文档?,电脑,系统,文件,首页,百度,软件,电机,管理,产品,设备,谁知

      配置linux命令行颜色?

      配置linux命令行颜色?,系统,地址,电脑,分析,代码,信息,设备,终端,颜色,命令,L

      linux配置相关的命令?

      linux配置相关的命令?,网络,地址,系统,工具,代码,状态,命令,信息,管理,初级,

      linux配置网卡的命令?

      linux配置网卡的命令?,网络,信息,系统,工具,代码,地址,设备,工作,电脑,最新,i

      linux中编辑文档命令?

      linux中编辑文档命令?,状态,工作,命令,电脑,信息,第一,系统,编辑,终端,文件,L

      配置网关的命令linux?

      配置网关的命令linux?,地址,系统,网络,代码,信息,环境,命令,网关,服务,电脑,

      linux配置ip命令行?

      linux配置ip命令行?,地址,系统,代码,网络,设备,工具,服务,密码,命令,网卡,lin

      linux配置文件夹命令?

      linux配置文件夹命令?,地址,系统,工作,信息,命令,标准,服务,名称,位置,文件,l