日期:2013-02-07  浏览次数:20435 次

Debug是整个软件开发过程中最痛苦的部分之一。我们不想说发现一个小bug是多么的困难-你可能已经都知道。软件中bug的数量是随着软件的复杂程度和经常没有及时修正bug而增长的。这些bug和软件的负责程度互相影响,使工程变得更加复杂。所以我们不断的监控和修改bug。

最好的办法是执行单元测试的时候来修正bug,当软件出现问题的时候,软件不会告诉我们哪里出现错误,为什么出现错误,我们的任务就是跟踪进程去解决他们。

这篇文章我们就是想告诉你怎样利用DotNet FrameWork来调试和跟踪让这个处理过程变得简单。我们将简要的告诉你怎么样有效的使用他们,并用结合例子说明。

跟踪

在这篇文章中首先要讨论的调试的策略是跟踪。跟踪是很强大的技术,因为他允许你看到应用程序的整个在运行期的整个行为,分析他是最有效的,尽管他不能提供需要的信息。

DotNet在System.Diagnostics名字空间中提供了跟踪的功能,正确的说是Trace Class

Trace是个静态类(这意味着所有的成员是静态的,你不需要初始化他来获得它的功能)

.产生一个断言(有条件或没有)

.根据提供的条件输出跟踪信息

.格式化跟踪输出信息

让我们从简要的成员方法开始研究:

public static void Assert(bool)

public static void Assert(bool,string)

public static void Assert(bool,string,string)



Assert方法显示一个失败信息(应用程序失败的时候显示信息,允许用户中断执行,忽略错误或者重新运行引起错误的代码),如果条件是false,两个重载函数允许显示指定的自定义一个或两个跟着的信息。(这些信息通过string参数设置,这么做允许开发者显示额外的断言失败的信息)

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false);

}

}

}

程序将显示下面的消息对话框




正如你看到的,仅仅是显示异常信息。没有显示任何上下文信息,所以我们不能看到失败的原因。下面,应用程序调用Assert方法用它的一个属性:

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false,”Simple assertion Message”);

}

}

}

这个程序显示了一个更多信息的对话框。可以看到我们能提供的关于失败原因的信息。


调用有两个信息的Assert方法,组成更加详细的断言:

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false,”Simple assertion Message”,”This message just an example.In real application you can provite detailed information here’);

}

}

}

你现在看到更加详细的信息:


事实上,当检查重要条件,比如数据正确性等情况的时候才用这种方法。下边是他最常用的例子:public void StoreObject(PersistentObject obj)

{

Trace.Assert(obj != null, "Cannot store null object");

}

这个方法检查object对象不是null的时候被存储。当程序失败的时候是产生异常的最好时间,但这不是必要条件。例如,如果这个方法保存了一些重要的程序数据,断言是完美的选择。

备注:调试跟踪是有用的,如果最终发行版本中包含了断言信息对用户来说是无法忍受的。下面的窍门可以帮助你控制跟踪开关。



如果你手工编译工程(比如命令行编译),缺省显示跟踪信息。如果在c#中用跟踪功能,当你编译代码的时候,要加/d:Trace标志来编译命令行,或者你可以简单的加入#define Trace到文件最顶端。

比如,下面的小程序:

using system;

using System.Diagnostics;

namespace TraceShow

{

class calss1

{

///<summary>

///The main entry point for the application

///</summary>

[STAThread]

static void Main(string[] args)

{

Trace.Listeners.Add(new TextWriterTraceLister(Console.Out));

Trace.Write(“Hey,this is a trace message\n”, “SIMPLE MESSAGE”);

}

}

}

如果在命令行编译,你将看不到任何信息,除非你加上/d:Trace或者加入#define Trace到