System.Diagnostics.Debug和System.Diagnostics.Trace
在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程、事件日志、和性能计数器进行交互的类库。当中包括了两个对开发人员而言十分有用的类——debug类和 trace类。本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率。
使用debug类来帮助调试
调试程序对每个程序员来说是家常便饭。可是我们会经常遇到一些情况让我们头疼,例如:
当我们在开发一个界面控件的时候,简单的设断点会增加paint事件的响应次数,而造成的环境参数改变。
断点设多了,程序常常停在正常运行的地方;这样一来,调试一个错误要花费大量时间去寻找错误。
这
时,我们就需要利用system.diagnostics.debug类来帮助我们调试。我们可以通过调用debug.writeline(string
message)函数,将我们所关心的信息打印在visual studio
ide的output窗口中。也可以利用debug.assert(bool condition)来让程序停在错误的地方,并且显示call
stack。
debug类中所有函数的调用都不会在release版本里有效。也就是说,我们通过这种方法所加的代码可以仅用于调试;在发布的时候无需删任何代码,就可以给用户一个没有调试指令的程序了。
下面的这个例子演示了这两个函数来帮助调试的方法:
1、 新建一个visual studio c# project,采用默认的项目名。
2、 往form1上拖一个label,并采用其缺省id。
3、 在form1.cs中的form1类中添加下面的函数代码:
private int time=;
protected override void onpaint(painteventargs e)
{
time++;
this.label1.text="onpain called "+time.tostring()+" times.";
} protected override void onresize(eventargs e)
{
system.diagnostics.debug.assert(this.width>,"width should be larger than 200.");
system.diagnostics.debug.writeline(size.tostring());
}
4、 编译并运行项目的debug版本。
5、 切换visual studio .net ide到output窗口。
6、
切换到刚才的程序,改变主窗口的大小,您可以在ide中看到form1窗口的实时大小,并在form1上看到onpaint被调用的次数。当窗口的宽度小
于等于200个像素的时候,系统会弹出一个assertion fail的对话框。里面显示了当前程序的call
stack。如果您在onpaint中设置了断点,想要调试程序的话,那么您会进入一个死循环,直到您停止调试。
debug类和trace类的区别
您一定发现了在system.diagnostics命名空间中还有一个名为trace的类。它的函数功能和debug非常相似。为什么要有这样两个功能类似的类呢?
原
因是这样的,debug类里所提供的函数仅在编译时带#debug宏参数才奏效,一旦到了release版本中,这些函数都会被忽略。也就是说debug
类的功能仅在程序员开发的时候能用。而trace则不同,它能在release版本的程序中也被运行,这样程序员就可以在release版本的程序中添加
一些debug类提供的功能了。
使用trace类来做程序日志
接下来的问题就是:我们程序员能利用trace类的功能做些什么呢?我们可以用它来做程序的日志。
1、 打开刚刚的project。
2、 用下面的代码覆盖刚才第2步的代码:
private void calculate()
{
int a=,b=;
try
{
system.random r = new random();
while (true)
{
a=(int)(r.nextdouble()*);
b=(int)(r.nextdouble()*);
system.diagnostics.trace.writeline(system.datetime.now.tostring()+": "+
a.tostring()+"/"+b.tostring()+"="+(a/b).tostring());
}
}
catch (exception ex)
{
system.diagnostics.trace.writeline(system.datetime.now.tostring()+": "+a.tostring()+
"/"+b.tostring()+"="+" error: "+ex.message);
messagebox.show(ex.message);
}
}
3、在构造函数form1()的最后添加下面的代码,将trace的输出重定向到app.log文件中:
system.diagnostics.trace.listeners.clear();
system.diagnostics.trace.autoflush=true;
system.diagnostics.trace.listeners.add(new system.diagnostics.textwritertracelistener("app.log"));
4、拖一个按钮到该form上,双击按钮,在button1_click函数中添加如下代码:
calculate();
application.exit();
5、运行该程序的release版本,点击添加的按钮,程序便开始执行一位随机数除法。由于是随机数,可能会出现出数为0的情况,这样程序就会抛出exception,这是程序会自动中止。
6、在该程序所在的目录里您可以发现出现了一个新的文件app.log,里面记录了各个时刻的运算纪录,并把exception纪录在日志中。
小结
利用 system.diagnostics.debug 类和 system.diagnostics.trace 类可以帮助程序员方便地进行调试程序并检测程序运行情况。
debug类的所有调用仅在程序的debug版本中有效;而trace类的调用能在release版本和debug版本中都有效。
System.Diagnostics.Debug和System.Diagnostics.Trace的更多相关文章
- System.Diagnostics.Debug和System.Diagnostics.Trace 【转】
在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...
- System.Diagnostics.Debug.WriteLine 在OutPut中无输出
TextWriterTraceListener writer = new TextWriterTraceListener(System.Console.Out); Debug ...
- (C# Debug)A first chance exception of type 'System.ArgumentException' occurred in System.Data.dll
Debug 模式下运行程序的时候,Output 窗口出来个错误“A first chance exception of type 'System.ArgumentException' occurred ...
- Unable to cast object of type 'System.Int32' to type 'System.String'.
最近在研究.netcore,尝试把前后端完全分离.但是在写接口的时候,Post参数是FromBody的时候报错了 Microsoft.AspNetCore.Diagnostics.DeveloperE ...
- Jexus .Net at System.Net.Sockets.Socket.Connect (System.Net.IPAddress[] addresses, System.Int32 port)
环境:Jexus(独立版)+MVC(5.2.3) +Redis+EF(6.0) Application Exception System.Net.Sockets.SocketException Con ...
- C# 计时器用法(DispatcherTimer、System.Timers.Timer、System.Threading.Timer)
首先,我觉得三种计时器最大的区别是:DispatcherTimer触发的内容会直接转到主线程去执行(耗时操作会卡住主线程),另外两个则是在副线程执行,如果需要修改界面,则需要手动转到主线程. Disp ...
- 对于System.exit(0)和System.exit(1)的一般理解
public static void exit(int status) 终止当前正在运行的 Java 虚拟机.参数用作状态码:根据惯例,非 0 的状态码表示异常终止. 该方法调用 Runtime 类中 ...
- 重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)”时违反了继承安全性规则
在.NET 4.0下使用最新版本的log4Net 1.2.10,会遇到下面这样的错误: 重写成员“log4net.Util.ReadOnlyPropertiesDictionary.GetObject ...
- System.out.println与System.err.println的区别(输出顺序!!!)
System.out.println与System.err.println的区别(输出顺序!!!) 分类:java (208) (0) System.out.println与System.err.p ...
随机推荐
- jsp中的隐含9对象
jsp中的隐含9对象 request ----> HttpServletRequest. response ---> HttpServletResponse. session ----&g ...
- python 字典相关操作
字典 字典的增删改查 字典的创建方式: # 创建字典类型 info = { 'name':'李白', 'age':'25', 'sex':'男' } msg = { 'user01':'Longzel ...
- C语言结构体及typedef关键字定义结构体别名和函数指针的应用
结构体(struct)的初始化 struct autonlist { char *symbol; struct nlist nl[2]; struct autonlist *left, *right; ...
- div中嵌套img元素,4px空白
写布局的过程中遇到一个问题,在div中嵌套了img元素,没有指定div的高度,嵌套之后div高度始终比img高4个像素,没有设置内外边距,找不到原因. 除非强制div的高度为img的高度,才能使div ...
- IEEEXtreme Practice Community Xtreme9.0 - Dictionary Strings
Dictionary Strings 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/dictio ...
- ROS知识(22)----USB口映射固定名字
如果有多个usb链接到电脑,如果插入的先后顺序不同,那么会导致对应的usb口也会不同,例如当只有一个激光的usb链接到电脑,其设备名字为/dev/ttyUSB0:当如果有底盘的usb以及激光的usb连 ...
- j.u.c系列(07)---之读写锁:ReentrantReadWriteLock
写在前面 重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少.然而读服务不存在数据竞争问题,如果一 ...
- Chrome中使用老的标题栏界面
Chrome 69中启用了新的UI界面,看着更加秀气了. 但新UI一个不好用的地方是标签栏太高了,留给windows标题栏的空白太小,导致拖动窗口位置非常不方便,如下是一个解决方法: 在地址栏输入: ...
- LPC-Link-II Rev C JTAG
- jquery 网页局部打印总结
最近开发过程中遇到了js局部打印的功能,在网上找相关的资料,最终找到了juery.jqprint-0.3.js 和jquery.PrintArea.js两种. 最初使用的是jquery.jqprint ...