Debug与Trace的区别
一.首先要明白Debug与Trace的区别:
1. Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
Debug类提供一组帮助调试代码的方法和属性。Trace类提供一组帮助跟踪代码执行的方法和属性,通俗的说就是为在不打断程序的调试或跟踪下,用来记录程序执行的过程。
Debug只在debug状态下会输出,Trace在Release下也会输出,在Release下Debug的内容会消失。
2. Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
首先以一个表格说明问题:
项目
Debug
Release
条件编译常数
Debug;Trace
Trace
优化代码
False
True
输出路径
bin\Debug
bin\Release
生成调试信息
True
False
Debug模式下生成的程序集为调试版本,未经优化;在bin\debug\目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;Release模式下不包含调试信息,并对代码进行了优化,\bin\release\目录下只有一个.exe或.dll文件。在项目文件夹下除了bin外,还有个obj目录。编译是分模块编译的,每个模块的编译结果就保存在了obj目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj的目录的作用就是保存这些小块的编译结果,加快编译速度。
二.Trace and Bug Sample
using System;
using System.Diagnostics; //引入Debug类所在命名空间
namespace traceanddebug
{
class TestDebug
{
public static void TestDebugMethod()
{
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
//将Debug类输出定向到控制台输出
Debug.AutoFlush = true;
//设置Debug为自动输出,即每次写入后都调用Listeners上调用Flush
Debug.Indent();
//设置缩进
Debug.WriteLine("Debug WriteLine()");
//用Debug输出"Debug WriteLine()"
Console.WriteLine("Console.WriteLine()");
//用Console输出"Console.WriteLine()"
Debug.Unindent();
//取消缩进
//Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
//将Trace类输出定向到控制台输出
//Trace.AutoFlush = true;
//设置Trace为自动输出,即每次写入后都调用Listeners上调用Flush
Trace.Indent();
//设置缩进
Trace.WriteLine("Trace WriteLine()");
//用Trace输出"Trace WriteLine()"
Console.WriteLine("Console.WriteLine()");
//用Console输出"Console.WriteLine()"
Trace.Unindent();
//取消缩进
Console.Read();
}
}
class Program
{
static void Main(string[] args)
{
TestDebug.TestDebugMethod();
}
}
}
三. C#将Trace,Debug信息输出到控件上(转)
主要实现方法,继承TraceLinster类,重写构造参数,重写Write和WriteLine方法就可以了,具体代码如下:
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)
{
// No need to lock control as this function will only
// ever be executed from the UI thread
_control.Text += msg;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xufei96/archive/2010/01/13/5186723.aspx
/************************************************/
本博客内容如果是原著都会在标题后加上(原著)字样,未加者多数为转载.
/************************************************/