一起谈.NET技术,System.Diagnostics命名空间里的Debug类和Trace类的用途【转】-阿里云开发者社区

开发者社区> 狼人2007> 正文

一起谈.NET技术,System.Diagnostics命名空间里的Debug类和Trace类的用途【转】

简介:   在 .NET 类库中有一个 System.Diagnostics命名空间,该命名空间提供了一些与系统进程、事件日志、和性能计数器进行交互的类库。当中包括了两个对开发人员而言十分有用的类Debug类和Trace类。
+关注继续查看

  在 .NET 类库中有一个 System.Diagnostics命名空间,该命名空间提供了一些与系统进程、事件日志、和性能计数器进行交互的类库。当中包括了两个对开发人员而言十分有用的类Debug类和Trace类。本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率。

  目录

  • 使用Debug类来帮助调试
  • Debug类和Trace类的区别
  • 使用Trace类来做程序日志
  • 小结
  • 参考资料

  使用Debug类来帮助调试

  调试程序对每个程序员来说是家常便饭。可是我们会经常遇到一些情况让我们头疼,例如:

  • 当我们在开发一个界面控件的时候,简单的设断点会增加Paint事件的响应次数,而造成的环境参数改变。
  • 断点设多了,程序常常停在正常运行的地方;这样一来,调试一个错误要花费大量时间去寻找错误。

  这时,我们就需要利用System.Diagnostics.Debug类来帮助我们调试。我们可以通过调用Debug.WriteLine(String message)函数,将我们所关心的信息打印在Visual StudioIDE的Output窗口中。也可以利用Debug.Assert(bool condition)来让程序停在错误的地方,并且显示Callstack。

  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的对话框。里面显示了当前程序的CallStack。如果您在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纪录在日志中。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Serverless Kubernetes全面升级2.0架构:支持多命名空间、RBAC、CRD、PV/PVC等功能
阿里云Serverless Kubernetes容器服务最新开放香港、新加坡、悉尼区域,同时全面开放2.0架构,帮助用户更加便捷、轻松地步入“以应用为中心”的全新架构。
3033 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
8920 0
System.Web.Mvc 命名空间
System.Web.Mvc 命名空间包含一些类和接口,它们支持用于创建 Web 应用程序的 ASP.NET 模型视图控制器 (MVC) 框架。该命名空间包含表示控制器、控制器工厂、操作结果、视图、分部视图以及模型联编程序等的类。
492 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
3528
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载