在写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的文件夹的作用就是保存这些小块的编译结果。加快编译速度。





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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuZGFjaGVuZzE5ODk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



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方法。

Debug与Trace工具类的应用的更多相关文章

  1. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...

  2. Apache Commons 工具类介绍及简单使用

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  3. linkin大话数据结构--apache commons工具类

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动. 一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆ge ...

  4. Apache Commons 工具类简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  5. C# 日志记录工具类--LogHelper.cs测试

    C# 日志记录工具类:(适用于不想使用log4j等第三方的Log工具的时候,希望自己写个简单类实现)LogHelper.cs内容如下: using System; using System.Diagn ...

  6. 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)

    搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...

  7. java核心技术第六篇之断言、日志、包装类型和工具类

    JDK1.5新特性: 1.自动拆装箱. 2.泛型 3.可变参数 4.静态导入 5.增强for循环 6.互斥锁 7.枚举 8.注解 JDK1.6新特性: 1.Desktop类和SystemTray类 2 ...

  8. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  9. Apache Commons 工具类介绍及简单使用(转载)

    原文链接 http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 ...

随机推荐

  1. HDU 1698.Just a Hook-线段树(成段替换、输出总和tree[1])

    HDU1698.Just a Hook 这个题是最最基础的成段更新的线段数的题目,直接贴代码吧. 代码: #include<iostream> #include<cstring> ...

  2. ZOJ 3940 Modulo Query (2016年浙江省赛E题,区间折叠 + map运用)

    题目链接  2016 ZJCPC Problem E 考虑一个开区间$[0, x)$对$a_{i}$取模的过程. $[0, x)$中小于$a_{i}$的部分不变,大于等于$a_{i}$的部分被切下来变 ...

  3. 集群/分布式/微服务/SOA 转

    https://www.cnblogs.com/Java3y/p/9479410.html 二.集群/分布式/微服务/SOA是什么? 像我这种技术小白,看到这些词(集群/分布式/微服务/SOA)的时候 ...

  4. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  5. 2017 China Collegiate Programming Contest Final (CCPC 2017)

    题解右转队伍wiki https://acm.ecnu.edu.cn/wiki/index.php?title=2017_China_Collegiate_Programming_Contest_Fi ...

  6. (转)unity3d加密资源并缓存加载

    http://www.haogongju.net/art/1931680 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止依然没有更新正确的示例代码. view source   pr ...

  7. rabbitmq集群节点操作

    节点恢复过程中把数据删掉很重要,恢复一单结点,再清数据 节点增加: 1. rabbitmq-server -detached   --- .erlang.cooike的权限,400 属主rabbitm ...

  8. 浅谈C#委托和事件(转载)

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  9. kata-container环境搭建

    一.安装qemu 注意,目前kata-container所要求的qemu最低版本是v2.7.0.在笔者的环境下(Ubuntu16.04 VM),apt-get官方源的最高版本是v2.5.0.所以不要用 ...

  10. Java过滤器(Filter)与SpringMVC拦截器(Interceptor)之间的关系与区别

    过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对action请求起作用,而过滤 ...