Dot Net的调试 - 2

Fail 方法不能阻止应用程序运行,他们仅仅输出错误信息。 Write 和 WriteLine 方法写入一个消息。他们不同之处仅仅在于后者输出执行后再输出一行。最后, Flush 方法刷新缓存。 Flush 方法对跟踪信息输出的设备有作用(例如,流)。你可以使用自动刷新 — 每个信息后都自动刷新侦听者。可以在配置文件里面配置:

1<configuration>
2<stream.diagnostics>
3<trace autoflush="“false”"></trace>
4</stream.diagnostics>
5</configuration>

正如你看到的,如果你创建自己的倾听者,需要至少实现 write(string) 和 writeline(string) 方法(这些方法是抽象方法)。

微软提供三种跟踪侦听者: DefaultTraceListener,EventLogTraceListener 和 TextWriteTraceLister. 。第一个侦听者有缺省的方法(如果应用程序在命令行的环境下运行,那么输出信息到控制台。如果应用程序在调试情况下,输出到窗口)。第二个侦听者输出信息到指定事件日志中(基于 nt 技术 —winnt,2k,xp 或者 .net )。第三个倾听者输出文本到流中。

活动倾听者列表可以在编程中设置或者在配置文件中。缺省包括 DefaultTraceListener.

编程改变活动倾听者列表,要管理倾听者集合(通过添加和删除方法)。配置文件中管理倾听者,你要用下边的语法:

 1<configuration>
 2<system.diagnostics>
 3<trace autoflust="”false”" indentsize="4">
 4<listeners>
 5<add initializedata="“c:\MyListener.log”/" name="”myListener”" system”="" type="”System.Dianostics.TextWriterTraceListener,">
 6<remove type="“System.Diagnostics.DefaultTraceListener,System”/">
 7</remove></add></listeners>
 8</trace>
 9
10</system.diagnostics></configuration>

InitializeDat 参数是传递到构造器的的字符串参数(指定 EventLogTraceListener 侦听者事件日志)。

侦听者很熟悉创建应用程序使用侦听者输出跟踪信息。代码很简单:

//Trace listeners demo

//

//purpose:To demonstrate how to use listeners

using System;

using System.Diagnostics;

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

Trace.WriteLine(“Calling WriteLine method”, “Trace Listeners demo”);

Trace.Flush();

}

}

}

这些代码还不够,我们必须创建一个配置文件来设置侦听者:

 1<configuration>
 2<system.diagnostics>
 3<trace autoflush="false" indentsize="4">
 4<listeners>
 5<remove type="System.Diagnostics.DefaultTraceListener"></remove>
 6<add initializedata="myListener.log" name="myListener" type="System.Diagnostics.TextWriterTraceListener"></add>
 7<add initializedata="Application" name="myListenerEventLog" type="System.Diagnostics.EventLogTraceListener"></add>
 8</listeners>
 9</trace>
10</system.diagnostics>
11</configuration>

这个配置文件删除了缺省侦听者加入两个自定义侦听者:第一个输出信息到文本文件,第二个输出到事件日志中。对于第一个侦听者 initializeData属性指定输出数据的文件,第二侦听者记录事件到事件日志。

运行程序。检查第一个侦听者,可以看到 myListener.log文件,它包含以下信息:Tracing listeners Demo:Calling WriteLine Method

第一个侦听者把信息写入文本文件中。察看第二个。打开微软控制台在事件视图中浏览应用程序事件日志(这个就是我们在配置文件中指定的)。在这里可以看到我们应用程序的事件信息。更多的可能,在这个列表最上边。如果你双击,可以看到其中的内容。我们发现如下信息:

是输出信息更加容易阅读:

有时候应用程序很复杂,为了容易理解可以格式化跟踪信息。使输出信息更加漂亮,可以使用缩排,看下面的简单代码:

public void Callee()

{

Trace.WrteLine(“Callee started”);

……//Some internal logic

Trace.WriteLine(“Initializing Buffer”);

……//Some extra internal login

Trace.WriteLine(“Exiting Callee”);

}

public void Caller()

{

Trace.Write(“Caller Called”);

…..//Some external logic

Callee();

…..//Some extral Logic

Trace.WriteLine(“Initializing Buffer”);

Trace.Write(“Exiting Caller”);

}

输出信息如下:

Caller called

Callee stared

Initializing buffer

Exiting Callee

Initializing buffer

Exiting Caller

如果方法执行前后没有显示信息,我们将被这些拷贝的初始化缓存信息所迷惑。除了信息显示不清楚。为了避免不明确,我们使用 Trace 类支持的缩进功能。修改的代码,使用缩进:

public void Callee()

{

Trace.indent();

Trace.WriteLine(“Callee started”);

…..//some internal logic

Trace.WriteLine(“Initializing Buffer”);

….//Some extra internal logic

Trace.WriteLine(“Exiting Callee”);

Trace.Unindent();

}

public void Caller()

{

Trace.Write(“Caller called”);

….//Some External Logic

Callee();

….//Some Extra Login

Trace.WriteLine(“Initiallizing buffer”);

Trace.Write(“Exiting Caller”);

}

输出信息如下:

Caller called

Callee started

Initializing buffer

Exiting Callee

Initializing buffer

Exiting Caller

正如你看到的, callee 方法输出缩进,很容易分开不同方法的信息。可以调用 Indent 和 Unident 方法,达到分离信息的目的。

在配置文件中修改跟踪配置:

1<configuration>
2<system.diagnostics>
3<trace indentsize="“3”">
4</trace></system.diagnostics>
5</configuration>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus