【问题标题】:Why doesn't Debug.WriteLine work without the DEBUG constant?为什么没有 DEBUG 常量 Debug.WriteLine 不能工作?
【发布时间】:2016-06-06 23:47:37
【问题描述】:

我遇到了一个问题,有人显然在我正在处理的 C# .NET 项目中禁用了 DEBUGTRACE 常量,所以我对 Debug.WriteLine 的调用没有任何效果。 (输出中没有显示调试输出。)在重新启用它们as described here 后,我开始看到我的输出。

知道如何解决它很有帮助,但我的问题是为什么?据我了解,DEBUG 是一个编译时间常数,而Debug 类在我构建项目时已经编译好了。那么我对Debug.WriteLine 的呼叫是如何被跳过的?它们不应该像我的所有其他代码一样编译吗?

我能想到几种可能的方式:

  • MS 在编译器中实现了一些特殊的“功能”来删除这些没有常量的调用
  • Visual Studio 设置调试器,使其在运行时根据此项目设置监听或不监听调试输出
  • Debug 有一些疯狂的代码检查调用程序集是否在编译时设置了某种标志

MS 的documentation 表示这是预期的行为,但我无法找到任何有关其实际工作原理的文档。当然,这也可能是我从未想过的事情。

那么它是如何工作的呢?

【问题讨论】:

    标签: .net debugging compile-time-constant


    【解决方案1】:

    查看Conditional attribute... 如果未定义指定的符号,它会导致在 JIT 时间忽略方法调用。大多数 System.Diagnostic.Debug 方法是使用此属性和值“DEBUG”定义的(例如,参见 reference source),因此如果在 JIT 时间未定义 DEBUG 符号,则不会发生调用。

    【讨论】:

    • 按要求更新
    【解决方案2】:

    如果在编译代码时未设置 DEBUG 常量,编译器将删除Debug.WriteLine(..) 调用。

    在代码中模拟这种情况的一种方法是使用#if DEBUG,例如:

    #if DEBUG 
        // This portion of the code will only exist in code compiled with the DEBUG constant set.
    #end if
    

    另一种方法是将ConditionalAttribute [Conditional("DEBUG")] 添加到方法的顶部,这就是Debug 类对WriteLine(..) 所做的事情。

    可以在 MSDN 上的 ConditionalAttribute 文档中的以下链接中找到确切的详细信息:https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx

    【讨论】:

    • 我只是想让您知道,我非常感谢您的回答。我就是否要求您更新您的或马特更新他的问题进行了一些辩论,但我最终选择了他的,因为它直截了当并且发布得更早了一点。但是,还是非常感谢你。 =)
    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 2019-01-04
    • 2020-09-03
    • 2016-10-10
    • 2016-10-24
    • 2017-02-27
    • 2017-07-08
    • 2014-11-23
    相关资源
    最近更新 更多