.NET BCL中的Trace和Debug有什么区别?

69

看起来System.Diagnostics.DebugSystem.Diagnostics.Trace在很大程度上是相同的,唯一的例外是在发布配置中编译时会省略Debug使用。

什么情况下使用一个而不是另一个?到目前为止,我找到的唯一答案就是你使用Debug类来生成只在调试配置中才能看到的输出,而Trace将保留在发布配置中,但这并没有真正回答我脑海中的问题。

如果你要插入代码,为什么还要使用Debug,因为可以在不重新编译的情况下关闭Trace

7个回答

72

主要区别就是你所指出的:Debug不包含在发布版中,而Trace则包含在其中。

据我理解,其预期的差异是,开发团队可以使用Debug来发出丰富、描述性的消息,这些消息可能对产品的消费者来说过于详细(或揭示太多细节),而Trace旨在发出更具体针对应用程序进行仪器化的消息。

回答你最后一个问题,我想不出为什么要使用Debug来调试一段我打算发布的代码。

希望这能有所帮助。


8
我完全不同意这个答案。Trace的级别比Debug低,不应该在生产环境中使用。依照我的经验,Trace用于方法的开头或跟踪工作流程中的某一部分,并以某种方式显示调用堆栈。在生产环境中,只应该使用Info、Warning、Error和Fatal这些级别,包括Info在内的所有级别都应该被使用。 - Razor
13
跟踪技术应该在生产中使用,它非常重要,以至于 Windows 的每个子系统都包含跟踪代码。每次硬盘寻道、每次内存分配、每次中断、CPU 上下文切换和每个线程调度都有跟踪代码嵌入其中。Windows 平台事件跟踪(ETW)是一种非常轻量级的跟踪系统,任何人都可以随时在任何 Windows PC 上启用它。System.Diagnostics.Tracing.EventSource 是将跟踪事件发送到 ETW 的托管方式。 - Ian Boyd
6
@VincePanuccio,我相信您谈论的是实际的日志级别,而这个问题是关于System.Diagnostics命名空间中的Debug和Trace类。您对每个日志级别的不同优先级有正确的想法。 - Ebsan
13
现在(4年后),我的观点与@Jared所给出的答案更加一致,认为追踪工具作为一种工具非常有用。因为我在不同团队工作时使用了追踪工具,发现它是很有用的。MSDN上有一些关于Trace类的好资料。看来我已经改变了之前“完全不同意”的观点。 - Razor
4
微软有关跟踪和仪表化应用程序的文档帮助我更好地理解了这些差异。 - Christoph Sonntag
显示剩余2条评论

5

trace和debug的唯一区别在于,当程序编译成发布版本时,默认情况下会包括trace语句,而不包括debug语句。

因此,在开发阶段,debug类主要用于调试,而在应用程序编译和发布后,可以使用trace进行测试和优化。


2
这完全取决于TRACE编译常量是否存在,这是Debug和Release的默认设置。 - Razor

5

调试(Debug)用于纯调试目的。它在调试执行(debug mode)中发出丰富的消息。

跟踪(Trace)有助于应用程序调试、错误修复和分析(发布后)。

Debug类在发布模式下没有用处。


1
这完全取决于编译常量 TRACE 和 DEBUG。 - Razor
@VincePanuccio 默认的构建设置是它们所是的,因为Debug和Trace旨在像这个答案所示的那样使用。是的,您可以更改TRACE和DEBUG常量以获得不同的行为,但这不是这两个类设计的目的。 - Darryl

4

Trace和Debug的完全区别:

Trace和Debug都使用System.Diagnostics命名空间。

Debug

  • 它使用Debug类。
  • 它用于调试构建。
  • 它用于应用程序开发的时间。
  • 在Debug模式下,编译器会将一些调试代码插入可执行文件中。
  • Debug类仅在Debug模式下工作。
  • 无法使用Debug进行性能分析。
  • 调试用于查找程序中的错误。
  • 我们可以使用Debug.Write()方法进行调试。
  • Debug在与主程序执行相同的线程中运行。

Trace

  • 它使用Trace类。
  • 默认情况下,当程序编译为发布版本时,会包括Trace语句。
  • 即使在应用程序编译和发布后,Trace类也用于测试和优化。
  • Trace类在Debug模式和release模式下均可使用。
  • Trace在与主程序执行线程不同的线程中运行。
  • 我们可以使用Trace.Write()方法进行跟踪。
  • 它使用应用程序部署的时间。

参考:C# Corner


2

对于高性能敏感的代码块,保留但禁用 Trace 可能会带来性能差异。


1

我会考虑使用log4net进行跟踪,因为它的功能更加灵活和强大。

但是对于真正的调试消息,我永远不打算让其他人看到,只有我或内部测试人员才能看到,我可能会坚持使用Debug。


关于哪个日志框架更好的问题,显示log4net并不比其他框架更灵活或更强大。https://dev59.com/Tm445IYBdhLWcg3wnrki - Mauro Sampietro

1

你已经回答了自己的问题。如果调试信息保留在代码中,其他人就可以看到它们。例如,假设你执行以下操作:

Debug.WriteLine("Connecting to DB with username: blah and PW: pass");

任何反编译您的代码的人都能看到这一点。但在测试期间,这可能是您非常重要需要知道的事情。

Trace 是不同的。如果你打算使用 Trace,我会倾向于使用 log4net。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接