Dot Net的调试 - 1

Debug是整个软件开发过程中最痛苦的部分之一。我们不想说发现一个小bug是多么的困难-你可能已经都知道。软件中bug的数量是随着软件的复杂程度和经常没有及时修正bug而增长的。这些bug和软件的负责程度互相影响,使工程变得更加复杂。所以我们不断的监控和修改bug。

最好的办法是执行单元测试的时候来修正bug,当软件出现问题的时候,软件不会告诉我们哪里出现错误,为什么出现错误,我们的任务就是跟踪进程去解决他们。

这篇文章我们就是想告诉你怎样利用DotNet FrameWork来调试和跟踪让这个处理过程变得简单。我们将简要的告诉你怎么样有效的使用他们,并用结合例子说明。

跟踪

在这篇文章中首先要讨论的调试的策略是跟踪。跟踪是很强大的技术,因为他允许你看到应用程序的整个在运行期的整个行为,分析他是最有效的,尽管他不能提供需要的信息。

DotNet在System.Diagnostics名字空间中提供了跟踪的功能,正确的说是Trace Class

Trace是个静态类(这意味着所有的成员是静态的,你不需要初始化他来获得它的功能)

.产生一个断言(有条件或没有)

.根据提供的条件输出跟踪信息

.格式化跟踪输出信息

让我们从简要的成员方法开始研究:

public static void Assert(bool)

public static void Assert(bool,string)

public static void Assert(bool,string,string)

Assert方法显示一个失败信息(应用程序失败的时候显示信息,允许用户中断执行,忽略错误或者重新运行引起错误的代码),如果条件是false,两个重载函数允许显示指定的自定义一个或两个跟着的信息。(这些信息通过string参数设置,这么做允许开发者显示额外的断言失败的信息)

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false);

}

}

}

程序将显示下面的消息对话框

正如你看到的,仅仅是显示异常信息。没有显示任何上下文信息,所以我们不能看到失败的原因。下面,应用程序调用Assert方法用它的一个属性:

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false,”Simple assertion Message”);

}

}

}

这个程序显示了一个更多信息的对话框。可以看到我们能提供的关于失败原因的信息。

调用有两个信息的Assert方法,组成更加详细的断言:

//Asertion Demo

//

//Purpose: To Demonstrate Results of Different Assert Method Calls

using System;

using System.Diagnostics

namespace Assertion

{

class Application

{

[STAThread]

static void Main(string[] args)

{

//Simple assertion. No additional message

Trace.Assert(false,”Simple assertion Message”,”This message just an example.In real application you can provite detailed information here’);

}

}

}

你现在看到更加详细的信息:

事实上,当检查重要条件,比如数据正确性等情况的时候才用这种方法。下边是他最常用的例子:public void StoreObject(PersistentObject obj)

{

Trace.Assert(obj != null, "Cannot store null object");

}

这个方法检查object对象不是null的时候被存储。当程序失败的时候是产生异常的最好时间,但这不是必要条件。例如,如果这个方法保存了一些重要的程序数据,断言是完美的选择。

备注:调试跟踪是有用的,如果最终发行版本中包含了断言信息对用户来说是无法忍受的。下面的窍门可以帮助你控制跟踪开关。

如果你手工编译工程(比如命令行编译),缺省显示跟踪信息。如果在c#中用跟踪功能,当你编译代码的时候,要加/d:Trace标志来编译命令行,或者你可以简单的加入#define Trace到文件最顶端。

比如,下面的小程序:

using system;

using System.Diagnostics;

namespace TraceShow

{

class calss1

{

///<summary>

///The main entry point for the application

///</summary>

[STAThread]

static void Main(string[] args)

{

Trace.Listeners.Add(new TextWriterTraceLister(Console.Out));

Trace.Write(“Hey,this is a trace message\n”, “SIMPLE MESSAGE”);

}

}

}

如果在命令行编译,你将看不到任何信息,除非你加上/d:Trace或者加入#define Trace到文件顶部。

当你在visual c#中编译程序这种情形将改变,visual c#中默认是可用的,结论是你将看到跟踪信息。关闭调试功能,浏览工程属性(可以在解决方案浏览器重或者view->property菜单项。在这个属性页面对话框中,发现条件编译常量(在configuration properties文件夹下,build pane中这个选项是锁定状态),去掉Trace选项):

public static void Fail(string)

public static void Fail(string, string)

Fail方法产生一个无条件断言。它的有些行为有点像Assert方法,但是他不需要任何处理条件。

带有简单条件的失败条件不能被选中那么用这个方法。下边的例子是这种异常的处理情形:

try

{

throw new Exception(“Sample Exception”);

}

catch(Exception Ex)

{

Trace.Fail(“Exception caught”, Ex.Message);

}

pubic static void Write(object)

public static void Write(string)

public static void Write(object, string)

public static void Write(string,string)

Trace类可以在不产生任何条件的情况下写入跟踪信息。比如信息输出到作为跟踪信息的接收者的设备中。用write方法执行输出。

Write方法可以建立作为对象或者字符串的描绘信息。以前的案例中,object.ToString被呼叫执行。有其他三个方法可以执行类似的行为:writeline输出行,writeif-条件信息,writelineif输出一行条件信息。

Write方法的第二个参数指定将要写入信息前的分类(比如 一个字符串)

输出被注册为侦听器。侦听器是可以输出跟踪信息到一些设备的对象。注意Assert和Fail方法经常输出错误信息到窗体或者控制台,不管那个侦听器被选中。这类对象必须继承TraceListener类,他有以下重要的方法:

public virtual void Fail(string)

public virtual void Fail(string,string)

public virtual void Flush(string)

public virtual void Write(object)

public abstract void Write(string)

public virtual void Write(object,string)

public virtual void Write(string,string)

public virtual void WriteLine(object)

public Virtual void WriteLine(string)

public virtual void writeLine(object,string)

public virtual void WriteLine(string,string)

时间: 2024-09-30 20:37:45

Dot Net的调试 - 1的相关文章

Dot Net的调试 - 3

调试 实际上调试和跟踪用得很普遍.Debug类中的方法有相同的名字的方法,这些方法实现了调试的功能.不同之处是在发布版本配置中是禁止使用的(这意味着不能产生二进制代码调用这些代码).调试输出也可以在配置文件设置,请看下面: <confuration> <system.diagnostics> <debug autoflush = "true" indentsize = "7" / > </system.diagnostics

Dot Net的调试 - 2

Fail方法不能阻止应用程序运行,他们仅仅输出错误信息.Write和WriteLine方法写入一个消息.他们不同之处仅仅在于后者输出执行后再输出一行.最后,Flush方法刷新缓存.Flush方法对跟踪信息输出的设备有作用(例如,流).你可以使用自动刷新-每个信息后都自动刷新侦听者.可以在配置文件里面配置: <configuration> <stream.diagnostics> <trace autoflush = "false" /> </s

有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代

有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 关于

《Redis官方文档》Redis调试指南

原文链接      译者:Adeline Redis开发过程中十分注重其稳定性:我们尽一切努力来保证每一个版本的稳定,不出现突然崩溃等情况.但是即使在我们百分百的努力下,仍然没办法保证百分百的无bug. Redis出现崩溃时,会生成一个详细的报告来描述当时的情景,但是有时候只看报告还不够,而且Redis的核心开发团队可能也没办法独立重现你出现崩溃时候的场景:在这种情况下,我们需要用户能够重现这个情景来帮助我们. 这个指南讲解了如何使用GDB来获得Redis开发者可能用到的信息. GDB是什么?

在Linux下调试Python代码的各种方法_python

 这是一个我用于调试或分析工具概述,不一定是完整全面,如果你知道更好的工具,请在评论处标记. 日志 是的,的确,不得不强调足够的日志记录对应用程序是多么的重要.您应该记录重要的东西,如果你的记录足够好的话,你可以从日志中找出问题从而节省大量的时间. 如果你曾经用print语句来调试代码现在停下吧,用logging.debug替代,开始可以慢慢来,以后完全禁用它... 追踪有时看到程序如何被执行会很有帮助.你可以使用IDE的调试共轭ngn一步一步的运行程序,但你需要知道你要找的是什么,否则这将会是

javascript中doT,juicer,artTemplate模板引擎分析与对比

再可以将前后端代码分离,岗位清晰,使后台程序人员可更好的去完成逻辑运算,而前端人员岗位更加专精.统一. js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Han

php异步调试和线上调试网站程序

  下面分享一种方法同时满足这两种条件,既方便网站程序错误调试,又不影响网站的正常运行的调试方法.将下面的php语句复制到公共代码顶部即可.  代码如下   //ini_set('error_reporting',E_ALL ^ E_NOTICE);//显示所有除了notice类型的错误信息 ini_set('error_reporting',E_ALL);//显示所有错误信息 ini_set('display_errors',off);//禁止将错误信息输出到输出端 ini_set('log_

adb-ubuntu真机调试,最后List of devices attached 下什么也没显示

问题描述 ubuntu真机调试,最后List of devices attached 下什么也没显示 按照网上教程ubuntu真机调试,最后List of devices attached 下什么也没显示 $sudo vim /etc/udev/rules.d/51-android.rules 加入以下内容: SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0cac",M

vs2008-VS搭配QT,x64平台下为挖三维编的dll,怎么调试

问题描述 VS搭配QT,x64平台下为挖三维编的dll,怎么调试 VS搭配QT,x64平台下为挖三维编的dll,怎么调试?新手,试过用挖三维打开调试,但是没看到界面在哪里,请懂得QT的前辈回答,谢谢! 解决方案 https://github.com/Vaa3D/Vaa3D_Wiki/wiki/Build-Vaa3D-on-Linux