.NET编译器 - DEBUG与RELEASE

时间:2008-08-26 19:20:09

标签: .net compiler-construction debugging

多年来,我一直在VB.NET中使用DEBUG编译器常量来将消息写入控制台。我也一直在以类似的方式使用System.Diagnostics.Debug.Write。我总是理解当使用RELEASE作为构建选项时,编译器会遗漏所有这些语句,从而释放生产代码中的调试语句开销。最近在使用Silverlight 2 Beta 2时,我注意到Visual Studio实际上附加了一个RELEASE构建,我正在运行一个公共网站并显示DEBUG语句,我认为这些语句甚至没有编译!现在,我的第一个倾向是假设我的环境有问题,但我也想问一下对System.Diagnostics.Debug和DEBUG构建选项有深入了解的人,我在这里可能会误解。

7 个答案:

答案 0 :(得分:21)

首选方法是实际使用条件属性来包装调试调用,而不是使用编译器指令。 #ifs可能会变得棘手并且可能导致奇怪的构建问题。

使用条件属性的示例如下(在C#中,但也适用于VB.NET):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

如果在未设置DEBUG标志的情况下进行编译,则将删除对WriteDebug的任何调用,因为调试时会调用Debug.Write()。

答案 1 :(得分:5)

检查Debug.Write方法。它标有

[Conditional("DEBUG")]

属性。

ConditionalAttribute州的MSDN帮助:

  

向编译器指示方法   应忽略呼叫或属性   除非指定的有条件   编译符号已定义

构建配置是否具有发布或调试标签无关紧要,重要的是是否在其中定义了DEBUG符号。

答案 2 :(得分:1)

我所做的是在我自己的类中封装对Debug的调用,并添加一个预编译器指令

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

答案 3 :(得分:1)

使用DEBUG编译器符号,就像你说的那样,实际上省略了程序集中的代码。

我相信System.Diagnostics.Debug.Write将始终输出到附加的调试器,即使您已在内置发布模式。根据{{​​3}}:

  

将有关调试的信息写入Listeners集合中的跟踪侦听器。

如果你不想要任何输出,你需要像DE一样用DEBUG常量来调用Debug.Write:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

答案 4 :(得分:1)

我也阅读了这篇文章,这让我相信,当没有定义DEBUG时,在System.Debug函数上声明的ConditionalAttribute将导致编译器完全省略此代码。我假设TRACE也是如此。也就是说,System.Diagnostics.Debug函数必须具有DEBUG和TRACE的ConditionalAttributes。那个假设我错了。单独的Trace类具有相同的功能,它们定义了依赖于TRACE常量的ConditionalAttribute。

来自System.Diagnostics.Debug:  _ 公共共享子写(_     消息作为字符串_ )

来自System.Diagnostics.Trace:  _ 公共共享子WriteLine(_     消息作为字符串_ )

那时我的原始假设似乎是正确的,System.Diagnostics.Debug(或system.Diagnostics.Trace)语句实际上并未包含在编译中,就好像它们包含在#IF DEBUG(或#IF TRACE)区域中一样。

但是我也从这些人那里学到了,并且验证了RELEASE构建本身并没有解决这个问题。至少对于Silverlight项目来说,这仍然有点不稳定,你需要进入“高级编译选项...”并确保未定义DEBUG。

我们从.NET 1.1 / VS2003跳到.NET 3.5 / VS2008,所以我认为其中一些工作方式不同,但可能在2.0 / VS2005中有所改变。

答案 5 :(得分:1)

要选择是要编译还是要删除调试信息,

在项目的属性窗口中输入“Build”选项卡。

选择正确的配置(Active / Release / Debug / All)并确保您 如果你想要信息,检查“DEBUG常数”, 如果不这样做,请取消选中。

应用更改并重建

答案 6 :(得分:-6)

根据我的经验,在VB.NET中选择Debug和Release之间没什么区别。您可以向两个配置添加自定义操作,但默认情况下我认为它们是相同的。

使用Release肯定不会删除System.Diagnostics.Debug.Write语句。