跟踪和检测应用程序

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

跟踪是在应用程序运行时监视其执行情况的一种方式。 可以在开发 .NET Framework 应用程序时向 .NET Framework 应用程序添加跟踪和调试检测,并且可以在开发应用程序时以及部署后使用该检测。 可以使用System.Diagnostics.TraceSystem.Diagnostics.DebugSystem.Diagnostics.TraceSource类在日志、文本文件或其他设备中记录有关错误和应用程序执行的信息,以供以后分析。

术语 检测 是指监视或度量产品性能级别和诊断错误的能力。 在编程中,这意味着应用程序能够合并:

  • 代码跟踪 - 在运行时接收有关应用程序执行的信息性消息。

  • 调试 - 跟踪和修复正在开发的应用程序中的编程错误。 有关详细信息,请参阅 调试

  • 性能计数器 - 允许跟踪应用程序性能的组件。 有关详细信息,请参阅 性能计时器

  • 事件日志 - 允许在应用程序执行中接收和跟踪主要事件的组件。 有关更多信息,请参见 EventLog 类。

通过在代码中的战略位置插入跟踪语句来监测应用程序,这对于分布式应用程序尤其有用。 通过使用跟踪语句,不仅可以检测应用程序,在出现问题时显示信息,还可以监视应用程序的性能。

TraceSource 类提供增强的跟踪功能,并可用于代替旧 Trace 类和 Debug 跟踪类的静态方法。 熟悉的 Trace 类和 Debug 类仍然被广泛使用,但推荐将 TraceSource 类用于新的跟踪命令,例如 TraceEventTraceData

Trace类和Debug类是相同的,区别只在于Trace类的过程和函数默认会编译为发布版本,而Debug类的过程和函数则不会。

这些 TraceDebug 类提供了在开发期间或在部署后监视和检查应用程序性能的方法。 例如,可以使用 Trace 该类跟踪部署应用程序中的特定类型的作(例如,创建新数据库连接),因此可以监视应用程序的效率。

代码跟踪和调试

在开发过程中,可以使用类的 Debug 输出方法在 Visual Studio 集成开发环境的“输出”窗口中显示消息(IDE)。 例如:

Trace.WriteLine("Hello World!")
Debug.WriteLine("Hello World!")
System.Diagnostics.Trace.WriteLine("Hello World!");
System.Diagnostics.Debug.WriteLine("Hello World!");

当应用程序在调试器中运行时,每个示例都将在“输出”窗口中显示“Hello World!” 。

这样,便可以根据应用程序在测试环境中的行为来调试应用程序并优化其性能。 你可以在调试版本中打开 Debug 条件属性,以调试应用程序,从而接收所有调试输出。 当应用程序准备好发布时,无需打开 Debug 条件属性即可编译发布版本,以便编译器不会在最终可执行文件中包含调试代码。 有关详细信息,请参阅 如何:利用跟踪和调试进行条件编译。 有关应用程序的不同生成配置的详细信息,请参阅 编译和生成

可以使用 Trace 类的方法来跟踪已安装应用程序中的代码执行。 可以将 Trace 开关放置到代码中,从而控制是否进行跟踪以及跟踪的范围。 这样,便可以在生产环境中监视应用程序的状态。 这在业务应用程序中尤其重要,该应用程序使用多台计算机上运行的多个组件。 可以通过配置文件控制部署后切换的使用方式。 有关详细信息,请参阅 如何:创建、初始化和配置跟踪交换机

在开发打算使用跟踪的应用程序时,通常会在应用程序代码中包含跟踪和调试消息。 准备好部署应用程序时,可以在不打开 Debug 条件属性的情况下编译发布版本。 但是,可以打开 Trace 条件属性,以便编译器在可执行文件中包含跟踪代码。 有关详细信息,请参阅 如何:利用跟踪和调试进行条件编译

代码跟踪的阶段

代码跟踪有三个阶段:

  1. 检测 - 向应用程序添加跟踪代码。

  2. 跟踪 - 跟踪 代码将信息写入指定目标。

  3. 分析 - 评估跟踪信息以识别和了解应用程序中的问题。

在开发过程中,默认情况下,所有调试和跟踪输出方法都会将信息写入 Visual Studio 中的“输出”窗口。 在已部署的应用程序中,方法将跟踪信息写入指定的目标。 有关指定用于跟踪或调试的输出目标的详细信息,请参阅 跟踪侦听器

下面是使用跟踪分析和更正已部署应用程序中潜在问题时通常涉及的主要步骤的总体视图。 有关如何执行这些步骤的详细信息,请参阅相应的链接。

若要在应用程序中使用跟踪
  1. 请考虑您希望在部署应用程序后现场接收的跟踪输出。

  2. 创建一组开关。 有关详细信息,请参阅如何:配置 Trace 开关

  3. 将跟踪语句添加到应用程序代码。

  4. 确定希望跟踪输出显示在何处并添加相应的侦听器。 有关详细信息,请参阅 创建和初始化跟踪侦听器

  5. 测试和调试应用程序及其包含的跟踪代码。

  6. 使用以下过程之一将应用程序编译为可执行代码:

    • 使用“生成”菜单以及解决方案资源管理器“属性页”对话框的“调试”页。 在 Visual Studio 中编译时,请使用此功能。

      - 或 -

    • 对编译的命令行方法使用 TraceDebug 编译器指令。 有关详细信息,请参阅使用跟踪和调试进行条件编译。 从命令行进行编译时,请使用此功能。

  7. 如果在运行时出现问题,请打开相应的跟踪开关。 有关详细信息,请参阅 配置跟踪交换机

    跟踪代码将跟踪消息写入指定目标,例如屏幕、文本文件或事件日志。 Trace.Listeners 集合中附带的侦听器类型确定目标。

  8. 分析跟踪消息,识别和了解应用程序中的问题。

跟踪工具和分布式应用程序

创建分布式应用程序时,可能会发现很难按照实际使用方式测试应用程序。 很少有开发团队能够测试作系统或 Web 浏览器(包括所有本地化语言选项)的所有可能组合,或模拟大量同时访问应用程序的用户。 在这些情况下,无法测试分布式应用程序如何响应大量、不同的设置和唯一的最终用户行为。 此外,分布式应用程序的许多部分没有用户界面,可以直接交互或查看这些部件的活动。

但是,可通过以下方式补偿此不足之处:启用分布式应用程序以描述系统管理员感兴趣的某些事件(尤其是故障事件),并检测应用程序(即,将跟踪语句置于代码中的关键位置)。 如果运行时发生意外事件(例如响应时间过慢),则可以确定可能的原因。

使用跟踪语句,可以避免检查原始源代码、修改代码、重新编译和尝试在调试环境中生成运行时错误等困难任务。 请记住,不仅可以检测应用程序以显示错误,还可以监视性能。

将跟踪语句置于关键位置

放置供运行时期间使用的跟踪语句时,必须特别小心。 必须考虑部署应用程序中可能需要哪些跟踪信息,以便充分涵盖所有可能跟踪方案。 但是,由于使用跟踪的应用程序存在很大差异,因此没有关于跟踪的战略放置的一般准则。 有关放置跟踪语句的详细信息,请参阅 如何:将跟踪语句添加到应用程序代码

跟踪的输出

跟踪输出由称为 侦听器的对象收集。 侦听器是接收跟踪输出并将其写入输出设备(通常是窗口、日志或文本文件)的对象。 创建跟踪侦听器时,通常会将其添加到 Trace.Listeners 集合中,从而允许侦听器接收所有跟踪输出。

在任何情况下,跟踪信息至少会写入默认的 Trace 输出目标 DefaultTraceListener。 如果由于某种原因删除了 DefaultTraceListener,并且没有向 Listeners 集合添加任何其他侦听器,则不会收到任何跟踪消息。 有关详细信息,请参阅 跟踪侦听器

下表中列出了写入跟踪信息的六 Debug 个成员和 Trace 方法。

方法 输出
Assert 指定的文本;若未指定,则为调用堆栈。 仅当在语句中 Assert 指定为参数的条件为 false 时,才会写入输出。
Fail 指定的文本;若未指定,则为调用堆栈。
Write 指定的文本。
WriteIf 如果满足指定为 WriteIf 语句中自变量的条件,则为指定的文本。
WriteLine 指定的文本和一个回车符。
WriteLineIf 如果满足指定为 WriteLineIf 语句中自变量的条件,则为指定的文本和一个回车符。

集合中的所有 Listeners 侦听器都接收上表中介绍的消息,但所执行的作可能会因接收消息的类型而异。 例如,当 DefaultTraceListener 收到 Fail 通知或失败 Assert 通知时,会显示断言对话框,而 TextWriterTraceListener 只是将输出写入其流。

可以通过实现自己的侦听器来生成自定义结果。 例如,自定义跟踪侦听器可能会向消息框显示消息,或连接到数据库以向表添加消息。 所有自定义侦听器都应支持上述六种方法。 有关创建开发人员定义侦听器的详细信息,请参阅 .NET Framework 参考中的 TraceListener

WriteWriteLine 方法始终编写您指定的文本。 AssertWriteIf并且 WriteLineIf 需要一个布尔参数,用于控制它们是否写入指定文本;仅当表达式为 true (for WriteIf 和) WriteLineIffalseAssert,它们才会写入指定的文本。 该方法 Fail 始终写入指定的文本。 有关详细信息,请参阅 如何将跟踪语句添加到应用程序代码中 和 .NET Framework 参考。

安全问题

如果在部署 ASP.NET 应用程序之前未禁用跟踪和调试,应用程序可能会透露恶意程序可能利用的信息本身。 有关详细信息,请参阅 如何:有条件地使用跟踪和调试进行编译编译和生成,以及如何:创建、初始化和配置跟踪开关。 也可通过 Internet 信息服务 (IIS) 配置调试。

另请参阅