首页 > 代码库 > Debug与Trace工具类的应用

Debug与Trace工具类的应用

在写Console程序的时候,可以使用Console.WriteLine()来时时的输出程序的运行状态和各种参数此刻的信息。但是如果是Windows Form程序,我们要如何实时的观测程序的运行状况呢?可以使用日志文件。但是使用日志文件有一个不足之处,就是日志文件是一个txt文件,不能够向控制台一样能够实时刷新的,这样的方法很不直观。日志文件在部署到服务器上的时候,因为服务器上没有VS,所以是调试程序唯一的选择。但是在本机上开发的时候,可以通过VS的Output窗口实时输出程序的运行状态。
Debug.WriteLine("ddd");这句话就相当于Console.WriteLine("ddd"),只是输出窗口不再是控制台,而是VS.


其实我们发现,还有Trace.Write方法,那么Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?程序编译成dll有两种模式,debug和release,首先我们来看一看两种模式的区别。Debug模式不会优化代码,但是会生成调试信息pdb,这样你在代码中设置断点就能调试了。Release模式下会优化代码,但是不会生成调试信息。Debug模式下生成的程序集为调试版本,未经优化;在bin/debug/目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;Release模式下不包含调试信息,并对代码进行了优化,/bin/release/目录下只有一个.exe或.dll文件。

在项目文件夹下除了bin外,还有个obj目录。编译是分模块编译的,每个模块的编译结果就保存在了obj目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj的目录的作用就是保存这些小块的编译结果,加快编译速度。


使用这两个工具类之前一定要在项目属性中,设置一下允许使用这两个类。


Debug类里所提供的函数仅在编译时带#Debug宏参数才奏效,一旦到了Release版本中,这些函数都会被忽略。也就是说Debug类的功能仅在程序员开发的时候能用。而Trace则不同,它能在Release版本的程序中也被运行,这样程序员就可以在Release版本的程序中添加一些Debug类提供的功能了。简单说,就是你的程序要发布了,你想给人家一个优化了的dll和exe,所以你把VS的编译模式设置成了Release,在这种情况下,你还是想在调一调程序,看一看其运行状态。但是如果此时使用Debug.WriteLine()就没有任何反应,因为这个在此模式下是没有作用的。此时你可以使用Trace.WriteLine(),此时是依然能够输出调试信息的。


还记得上边在项目属性中选中的那个define Trace constant选项吗?那个选项的作用是,如果你选中了,那么程序在编译的时候就会把Trace的相关代码编译到dll中,在VS调试的时候可以输出信息,而且部署到服务器上依然可以有用。有人说,服务器上不是没有VS吗?其实Trace类的输出方向是可以重定位的,我们可以使其输出到文本文件或者windows Log记录中。

public class ControlTraceListener : TraceListener
{
	private Control _control;
	private StringSendDelegate _invokeWrite;
	private delegate void StringSendDelegate(string msg);

	public ControlTraceListener(Control target)
	{
		_control = target;
		_invokeWrite = new StringSendDelegate(SendString);
	}
	public override void Write(string message)
	{
 		_control.Invoke(_invokeWrite, new object[] { message });
	} 
	public override void WriteLine(string message)
	{
		_control.Invoke(_invokeWrite, new object[] { message + Environment.NewLine });
	}
	private void SendString(string msg)
	{
 		_control.Text += msg;
	}
}

而且TraceListener的应用很多,比如说在Enterprise Logging中,就重写了TraceListener方法。