如何使用 Debug 和 Trace 类

作者:网络 来源:佚名 更新时间:2009-06-18 16:00:22 点击:
 

本文介绍如何使用 debug 和 trace 类。microsoft .net framework 中提供了这两个类。在应用程序开发期间或部署到产品后,可以使用这两个类提供有关应用程序性能的信息。这两个类只是 .net framework 中所提供配置功能的一部分。

 

要求下面的列表概括了推荐的硬件、软件、网络结构以及所需的 service pack:

• microsoft windows 2000 或 microsoft windows xp

• microsoft visual c# .net

本文还假定您熟悉程序调试。

 

方法说明

在使用 debug 类创建一个示例一节中介绍的步骤演示了如何创建使用 debug 类以提供有关程序执行信息的控制台应用程序。

 

当程序运行时,您可以使用 debug 类的方法来生成消息,以帮助您监视程序执行顺序、检测故障或提供性能度量信息。默认情况下,debug 类产生的消息显示在 visual studio 集成开发环境 (ide) 的“输出”窗口中。

 

该代码示例使用 writeline 方法生成后面带有行结束符的消息。当您使用此方法生成消息时,每条消息在“输出”窗口中均显示为单独的一行。

 

如果使用 debug 类的 assert 方法,那么只有在指定条件计算为 false 时,“输出”窗口才显示消息。该消息还在一个模式对话框中向用户显示。该对话框包括消息、项目名和 debug.assert 语句编号。该对话框还包括下列三个命令按钮:

• 终止:应用程序停止运行。

• 重试:应用程序进入调试模式。

• 忽略:应用程序继续。

用户必须先单击这些按钮中的一个,然后应用程序才可以继续。

 

您还可以指示从 debug 类向“输出”窗口以外的目标进行输出。debug 类有一个名为 listeners 的集合,该集合包括一些 listener 对象。

 

每个 listener 对象都监视 debug 输出并使输出指向指定的目标。

 

listener 集合中的每个 listener 都接收 debug 类生成的任何输出。请使用 textwritertracelistener 类定义 listener 对象。可以通过 textwritertracelistener 类的构造函数为该类指定目标。

 

一些可能的输出目标包括: • 使用 system.console.out 属性指定“控制台”窗口作为输出目标。

• 使用 system.io.file.createtext("filename.txt") 语句指定文本文件 (.txt) 作为输出目标。

创建 textwritertracelistener 对象后,必须将该对象添加到 debug.listeners 集合才可接收调试输出。

 

 

使用 debug 类创建一个示例1. 启动 visual studio .net。

2. 新建一个名为 coninfo 的新 visual c# .net 控制台应用程序项目。将创建 class1。

3. 在 class1 的顶部添加以下名称空间。

using system.diagnostics;

 

4. 要初始化变量以使其包含产品的相关信息,请将下面的声明语句添加到 main 方法:

string sprodname = "widget";

int iunitqty = 100;

double dunitcost = 1.03;

 

5. 将类生成的消息指定为 writeline 方法的第一个输入参数。按 ctrl+alt+o 组合键以确保“输出”窗口可见。

debug.writeline("debug information-product starting ");

 

6. 为了清晰易读,请使用 indent 方法在“输出”窗口中缩进后面的消息:

debug.indent();

 

7. 要显示所选变量的内容,请使用 writeline 方法,如下所示:

debug.writeline("the product name is " + sprodname);

debug.writeline("the available units on hand are" + iunitqty.tostring());

debug.writeline("the per unit cost is " + dunitcost.tostring());

 

8. 您还可以使用 writeline 方法显示现有对象的名称空间和类名称。例如,下面的代码在“输出”窗口中显示 system.xml.xmldocument 命名空间:

system.xml.xmldocument oxml = new system.xml.xmldocument();

debug.writeline(oxml);

 

9. 要整理输出,可以包括一个类别作为 writeline 方法的第二个可选的输入参数。如果您指定一个类别,则“输出”窗口消息的格式为“类别:消息”。例如,以下代码的第一行在“输出”窗口中显示“field:the product name is widget”:

debug.writeline("the product name is " + sprodname,"field");

debug.writeline("the units on hand are" + iunitqty,"field");

debug.writeline("the per unit cost is" + dunitcost.tostring(),"field");

debug.writeline("total cost is " + (iunitqty * dunitcost),"calc");

 

10. 仅在使用 debug 类的 writelineif 方法将指定条件计算为 true 时,“输出”窗口才可以显示消息。将要计算的条件是 writelineif 方法的第一个输入参数。writelineif 的第二个参数是仅在第一个参数的条件计算为真时才显示的消息。

debug.writelineif(iunitqty > 50, "this message will appear");

debug.writelineif(iunitqty < 50, "this message will not appear");

 

 

11. 使用 debug 类的 assert 方法,使“输出”窗口仅在指定条件计算为 false 时才显示消息:

debug.assert(dunitcost > 1, "message will not appear");

debug.assert(dunitcost < 1, "message will appear since dunitcost < 1 is false");

 

 

12. 为“控制台”窗口 (tr1) 和名为 output.txt (tr2) 的文本文件创建 textwritertracelistener 对象,然后将每个对象添加到 debug listeners 集合中:

textwritertracelistener tr1 = new textwritertracelistener(system.console.out);

debug.listeners.add(tr1);

 

textwritertracelistener tr2 = new textwritertracelistener(system.io.file.createtext("output.txt"));

debug.listeners.add(tr2);

 

13. 为了清晰易读,请使用 unindent 方法去除 debug 类为后续消息生成的缩进。当您将 indent 和 unindent 两种方法一起使用时,读取器可以将输出分成组。

debug.unindent();

debug.writeline("debug information-product ending");

 

14. 为了确保每个 listener 对象收到它的所有输出,请为 debug 类缓冲区调用 flush 方法:

debug.flush();

 

 

使用 trace 类 您还可以使用 trace 类生成监视应用程序执行的消息。trace 和 debug 类共享大多数相同的方法来生成输出,这些方法包括: • writeline

• writelineif

• indent

• unindent

• assert

• flush

您可以在同一应用程序中分别或同时使用 trace 和 debug 类。在一个“调试解决方案配置”项目中,trace 和 debug 两种输出均为活动状态。该项目从这两个类为 listener 对象生成输出。但是,“发布解决方案配置”项目仅从 trace 类生成输出。该“发布解决方案配置”项目忽略任何 debug 类方法调用。