zoukankan      html  css  js  c++  java
  • Debug与Trace工具类的应用

    在写Console程序的时候,能够使用Console.WriteLine()来时时的输出程序的执行状态和各种參数此刻的信息。可是假设是Windows Form程序,我们要怎样实时的观測程序的执行状况呢?能够使用日志文件。可是使用日志文件有一个不足之处,就是日志文件是一个txt文件,不能够向控制台一样能够实时刷新的,这个方案非常不直观。日志文件在部署到server上的时候。由于server上没有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调试的时候能够输出信息,并且部署到server上依旧能够实用。有人说,server上不是没有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方法。

  • 相关阅读:
    51单片机数码管字符H自右向左移动
    51单片机点亮双向流水灯
    React 动态增减表单项
    React--Tree 点击节点收缩
    Redis 操作异常
    Linxu 后台运行
    vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver
    vert.x学习(三),Web开发之Thymeleaf模板的使用
    vert.x学习(二),使用Router来定义用户访问路径
    vert.x学习(一),开篇之hello world
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7239479.html
Copyright © 2011-2022 走看看