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到