生产代码中的System.Diagnostics.Debug.WriteLine


69

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

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

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

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


1
谢谢所有回答的人。@Phil Devaney,@ Mitch Wheat和@ Agent_9191都用不同的措词给出了几乎相同的答案,因此我对所有人表示赞成,但我只能接受一个答案。我会和谁先回答一起去的,但这似乎是nMitch和Phil之间的平手,所以Mitch没有冒犯,但我将分给得分较低的Phil。
大卫,2009年

对于其他人,在发行版本中搜索以下Debug.WriteLine可能也很有趣。
2015年

Answers:



17

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

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


12

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


2
更具体地说,不要定义DEBUG。如果您创建“发布”版本(最少的符号,优化的代码等)但定义了DEBUG,则Debug方法仍将被调用,对吗?
lmat-恢复莫妮卡2012年

7

仅当您在“调试”模式下运行时,调试信息才可见。在发布模式下,任何Debug语句都不可见(如果希望这些语句在发布模式下可见,则可以使用Trace而不是Debug)。

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


2

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.