72

我可能应该已经知道这一点,但我不确定,也没有看到它记录在案。

我在开发过程中经常使用 System.Diagnostics.Debug.WriteLine,以便能够在调试代码时跟踪变量或异常的更改。这是为了使开发和理解在开发过程中发生的事情更容易。我通常在投入生产时要么注释掉代码,要么将其删除。

我想知道如果我忘记将代码注释掉会发生什么。例如,在开发周期中,我正在跟踪错误信息,这些错误信息可能会使用 Debug.Write Line 将连接字符串记录到输出窗口。这在开发时显然没问题,但我想知道当我上线时,这里是否存在风险。有人可以将调试器附加到我的实时可执行文件并捕获此输出吗?还是它只在 Visual Studio 中产生输出?

当我们从调试切换到发布时呢?如果我们为发布而编译,编译器会忽略此代码吗?

4

6 回答 6

89

Debug 类中的所有成员都标有ConditionalAttribute,因此调用站点不会编译到 Release 版本中。

于 2009-10-21T14:00:13.793 回答
18

System.Diagnostics.Debug方法调用仅在定义“DEBUG”条件编译符号时出现。默认情况下,“DEBUG”符号仅为调试版本定义。

ConditionalAttribute除非“DEBUG”被定义为条件编译符号,否则支持 忽略对这些方法的调用的编译器。

于 2009-10-21T13:59:34.717 回答
13

由于 Debug 方法都具有 [Conditional("DEBUG")] 属性,因此如果您从 Debug 切换到 Release,则不必担心,因为对这些方法的调用将被删除(以及其他优化发布版本)。

于 2009-10-21T14:00:34.497 回答
7

只有在调试模式下运行时才能看到调试信息。在发布模式下,不会看到任何 Debug 语句(如果您希望这些语句在 Release 模式下可见,则可以使用Trace而不是Debug )。

http://support.microsoft.com/kb/815788

于 2009-10-21T14:06:34.717 回答
2

/d:DEBUG如果您在没有选项 或的情况下进行编译#define DEBUG,您的 WriteLine 调用将不会实际出现在您的发布代码中;任何第三方都无法从这些调用中恢复任何信息,因为它们在发布版本中实际上不存在。

更多详细信息:MSDN 上的调试类 (System.Diagnostics)

于 2009-10-21T14:03:20.843 回答
1

几乎所有 Debug 成员都标有 ConditionalAttribute。诸如 C# 之类的编译器将在 Release 构建期间跳过对这些方法的调用,因此您是安全的。

此处的模式信息:http: //msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

于 2009-10-21T14:02:06.260 回答