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=0;
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>200,"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=1,b=1;
try
{
system.random r = new random();
while (true)
{
a=(int)(r.nextdouble()*10);
b=(int)(r.nextdouble()*10);
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 ...
随机推荐
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- jQuery in action 3rd - Introducing jQuery
2014 年 10 月, jQuery Foundation 的总裁 Dave Methvin 发布了一篇博客(http://blog.jquery.com/2014/10/29/jquery-3-0 ...
- HibernateTemplate和HibernateDaoSupport(spring注入问题)
HibernateTemplate HibernateTemplate是spring提供的一个就hibernate访问持久层技术而言.支持Dao组件的一个工具.HibernateTemplate提供持 ...
- C++混合编程之idlcpp教程Lua篇(2)
在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Lua 语言的例子.首先看第一个示例程序 LuaTuto ...
- IHttpActionResult – new way of creating responses in ASP.NET Web API 2
先收藏这篇文章. http://www.strathweb.com/2013/06/ihttpactionresult-new-way-of-creating-responses-in-asp-net ...
- 用c#开发微信 (12) 微统计 - 阅读分享统计系统 2 业务逻辑实现
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- SQL——神奇代码1之Update
说明:一个带有update的循环的代码.很简单,但是在QQ群里问了,应该说是很少有人注意这个问题,也就是很少有人真的理解SQL中的Update. 代码如下: if object_id('tempdb. ...
- django with mysql (part-2)
step01: write a ( views.py ) file vim views.py Insert the below code : step02: configure your ( urls ...
- Atitit selenium3 新特性
Atitit selenium3 新特性 Selenium2.0 支持了webdriver api,,原来自己的api放弃了. Selenium v2.45.0 发布,支持Firefox 3 ...
- paip.前端加载时间分析之道优化最佳实践
paip.前端加载时间分析之道优化最佳实践 1.另存为 ,查看文件尺寸..和图片. 2.view the 另存为的htm静态的文件单个的加载,看时间...可以排除编程语言的问题and 数据库.. ## ...