检测和跟踪的介绍
“检测”一词是指监视或测量产品性能级别和诊断错误的功能。 在编程中,它表示应用程序能够加入下列功能:
代码跟踪 - 接收有关应用程序在运行时执行情况的提示性消息。
调试 - 检测到正在开发的应用程序中的编程错误并修正这些错误。 有关更多信息,请参见调试。
性能计数器 - 这些组件用于跟踪应用程序的性能。 有关更多信息,请参见Introduction to Monitoring Performance Thresholds。
事件日志 - 这些组件用于接收和跟踪应用程序执行过程中的重要事件。 有关更多信息,请参见 EventLog 类。
通过 Trace 和 Debug 类,可以在开发过程中或部署后监视和检查应用程序性能。 例如,您可以使用 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!");
System.Diagnostics.Trace.WriteLine("Hello World!");
System.Diagnostics.Debug.WriteLine("Hello World!");
当在调试器中运行应用程序时,以上的每个示例都将在“输出”窗口中显示“Hello World!”。
这样,您就可以根据应用程序在测试环境中的行为来对其进行调试并优化它们的性能。 在调试版本中调试应用程序时,可以打开 Debug 条件特性,以便接收所有调试输出。 当您的应用程序准备好发布时,可以在关闭 Debug 条件特性的情况下编译您的发布版本,使编译器不会在最终可执行文件中包含调试代码。 有关更多信息,请参见如何:使用跟踪和调试进行条件编译。 有关应用程序的不同生成配置的更多信息,请参见在 Visual Studio 中生成。
您也可以使用 Trace 类的方法来跟踪已安装的应用程序中的代码执行情况。 通过将跟踪开关放置在代码中,可以控制是否进行跟踪以及跟踪的范围。 这样,您就可以在生产环境中监视应用程序的状态。 对于使用在多台计算机上运行的多个组件的商务应用程序,这一点尤为重要。 您可以通过配置文件来控制如何在部署后使用开关。 有关更多信息,请参见如何:配置跟踪开关。
在开发要使用跟踪的应用程序时,您通常会在应用程序代码中包括跟踪和调试消息。 当您准备好部署应用程序时,可以在关闭 Debug 条件特性的情况下编译您的发布版本。 不过,您可以打开 Trace 条件特性,让编译器在可执行文件中包括跟踪代码。 有关更多信息,请参见如何:使用跟踪和调试进行条件编译。
代码跟踪的阶段
代码跟踪分为三个阶段:
插入检测点 — 将跟踪代码添加到应用程序中。
跟踪 — 跟踪代码将信息写入指定的目标。
分析 — 评估跟踪信息,以确定并了解应用程序中的问题。
在开发过程中,所有调试和跟踪输出方法都会在默认情况下将信息写入 Visual Studio 中的“输出”窗口。 在已部署的应用程序中,这些方法会将跟踪信息写入您指定的目标。 有关为跟踪或调试指定输出目标的更多信息,请参见跟踪侦听器。
跟踪检测和分布式应用程序
在创建分布式应用程序时,您可能很难做到对其进行实际使用条件下的测试。 很少有开发组能够将操作系统或 Web 浏览器(包括所有本地化语言版本)的所有可能的组合形式统统测试一遍,或模拟众多用户同时访问应用程序的情形。 在这些情形下,您无法测试分布式应用程序将如何对庞大的数据量、设置上的差异和独特的最终用户行为作出响应。 另外,分布式应用程序的许多部分都没有用户界面可用来直接交互或查看这些部分的活动。
不过,这种情况也有补救方法,即通过检测应用程序(也就是在代码中的关键位置放置跟踪语句),使分布式应用程序能够描述系统管理员感兴趣的某些事件,尤其是出错事件。 这样,如果在运行时出现异常的情况(例如响应特别慢),就可以确定可能的原因。
利用跟踪语句,可以避免诸如检查原始源代码、修改原始源代码、重新编译源代码,以及尝试在调试环境中生成运行时错误等困难任务。 请记住,通过在应用程序中插入检测点,不仅可以显示错误,还可以监视性能。
将跟踪语句置于关键位置
在放置跟踪语句以便在运行时使用时,必须特别小心。 您必须考虑在已部署的应用程序中可能需要什么跟踪信息,以充分地包括所有可能的跟踪方案。 由于使用跟踪的应用程序各不相同,因此有关如何将跟踪语句置于关键位置,并没有通用的指南。 有关放置跟踪语句的更多信息,请参见如何:向应用程序代码添加跟踪语句。
跟踪的输出
跟踪输出由名为“侦听器”的对象来收集。 侦听器是接收跟踪输出并将其写入输出设备(通常是窗口、日志或文本文件)的对象。 跟踪侦听器在创建后,通常会添加到 Trace.Listeners 集合中,这样侦听器就可以接收所有跟踪输出。
在任何情况下,跟踪信息至少会写入默认的 Trace 输出目标:DefaultTraceListener。 如果您因为某种原因删除了 DefaultTraceListener 而没有将其他任何侦听器添加到 Listeners 集合中,则将收不到任何跟踪消息。 有关更多信息,请参见跟踪侦听器。
下表列出了六个写入跟踪信息的 Debug Members 和 Trace 方法。
方法 |
Output |
---|---|
断言 |
指定的文本;如果未指定任何文本,则为“调用堆栈”。 只有当 Assert 语句中以参数形式指定的条件为 false 时,才会写入输出。 |
Fail |
指定的文本;如果未指定任何文本,则为“调用堆栈”。 |
Write |
指定的文本。 |
WriteIf |
如果满足 WriteIf 语句中以参数形式指定的条件,则为指定的文本。 |
WriteLine |
指定的文本和一个回车。 |
WriteLineIf |
如果满足 WriteLineIf 语句中以参数形式指定的条件,则为指定的文本和一个回车。 |
Listeners 集合中所有的侦听器都会接收到上表中的消息,但种类不同的侦听器在接到消息后所执行的操作可能也不同。 例如,DefaultTraceListener 将在接收到 Fail 或失败的 Assert 通知时显示一个断言对话框,而 TextWriterTraceListener 仅输出写入它的流中。
您可以通过实现您自己的侦听器来生成自定义的结果。 例如,自定义跟踪侦听器可以将消息显示在消息框中,或连接到数据库并将消息添加到一个表中。 所有自定义侦听器都应支持上述六个方法。 有关创建开发人员定义的侦听器的更多信息,请参见 .NET Framework 参考中的 TraceListener。
Visual Basic 说明 |
---|
在 Visual Basic 2005 中,Debug.Write、Debug.WriteIf、Debug.WriteLine 和 Debug.WriteLineIf 方法替换了 Visual Basic 的早期版本中提供的 Debug.Print 方法。 |
Write 和 WriteLine 方法始终会写入您指定的文本。 Assert、WriteIf 和 WriteLineIf 需要 Boolean 参数,该参数控制它们是否写入指定的文本;只有在表达式为 true(对于 WriteIf 和 WriteLineIf)或 false(对于 Assert)时,它们才会写入指定的文本。 Fail 方法始终会写入指定文本。 有关更多信息,请参见如何:向应用程序代码添加跟踪语句和 .NET Framework 参考。
安全因素
如果在部署 ASP.NET 应用程序之前没有禁用跟踪和调试,应用程序可能会暴露自身相关信息,而这些信息可能会被某个恶意程序利用。 有关更多信息,请参见如何:使用跟踪和调试进行条件编译、在 Visual Studio 中生成和如何:配置跟踪开关。 调试也可以通过 Internet 信息服务 (IIS) 进行配置。