.net中的Debug与Trace的调试心得

作者:小菜 更新时间:2025-03-16 点击数:
简介:最近在读《.NET开发人员调试策略》,书倒是不错,只是翻译的比较差。

不过里面介绍的一些调试的心得还不错,有些收获。

下面我就总结下本书中关于Debug和Trac

【菜科解读】

最近在读《.NET开发人员调试策略》,书倒是不错,只是翻译的比较差。

不过里面介绍的一些调试的心得还不错,有些收获。

下面我就总结下本书中关于Debug和Trace的一些应用,算作一种读书笔记。

粗略概括下关于修改BUG的几种方法:

通过调试器调试

顾名思义就是跟踪源代码进行调试,微软还提供了远程调试的功能。

通过源代码的方式调试,我们一般会采用以下的几种方法:

使用Exception

使用MessageBox。

使用#if Debug .. #endif

使用断言调试:其中有Debug.Assert和Trace.Assert两种,Debug只在Debug模式下有效,Trace则都有效。

断言模式还有个优点,可以直接点击按钮重试,选择调试器进行调试。

当然还有通过堆栈跟踪或者其他的一些特殊手段等等。

.net所提供的断言调试相当强大,建议大家采用该方法。

具体应用请自行寻找资料。

msdn:

Debug.Assert 方法

Trace.Assert 方法

通过日志调试

想必大家肯定遇到过,有些BUG在客户那边会出现,但是本机就是模拟不出来。

而客户要嘛远隔万里,要嘛就是不允许安装远程调试。

在这种情况下,就可以通过日志调试,也就是将一些重要的信息写到文本中,当出现问题或者BUG可以通过查看日志文件来查找原因。

记录日志文件,就是写文件的操作,可以有很多种方法。

此处介绍下通过.net提供的侦听器与开关记录日志。

1.直接创建

1 static void Main(string[] args)2 {3 bool someBool = true;4 Trace.Listeners.Add(new TextWriterTraceListener(@"C:\MyListener.log")); 5 Trace.AutoFlush = true;//每次写入日志后是否都将其保存到磁盘中6 7 Trace.WriteLine(DateTime.Now.ToString() + "--Enter function LogTest");8 Trace.Indent(); //缩进+19 Trace.WriteLine("This is indented once");10 Trace.Indent();11 Trace.WriteLineIf(someBool, "Only written if someBool is true");12 Trace.Unindent(); //缩进-113 Trace.Unindent();14 Trace.WriteLine("Leave function LogTest");15 }

日志内容:

2012-05-30 14:11:41--Enter function LogTest This is indented once Only written if someBool is trueLeave function LogTest

2.通过配置文件创建

App.config

1 static void Main(string[] args)2 {3 TraceSwitch ts = new TraceSwitch("MySwitch", "descrption");//开关4 Trace.WriteLine(DateTime.Now.ToString() + "--Enter function LogTest");5 Trace.Indent(); //缩进+16 Trace.WriteLine("This is indented once");7 Trace.Indent();8 Trace.WriteLineIf(ts.TraceInfo, "MySwitch TraceInfo is true!");9 Trace.Unindent(); //缩进-110 Trace.Unindent();11 Trace.WriteLine("Leave function LogTest");12 }

日志内容:

2012-05-30 14:19:43--Enter function LogTest This is indented once MySwitch TraceInfo is true!Leave function LogTest

3.windows事件日志

通过Trace或者Debug中的EventLogTraceListener即可写入事件日志。

.net,中的,Debug,与,Trace,的,调试,心得,

Javascript中的“作用域链”知识分享

7 for(var i = 0; i发生了什么事情很多人都可能知道上例的执行结果,但是不是所有人都明白为什么会是这样的结果,包括我自己。

名词解释活动对象:一次函数调用开始的时候,javascript解释器会收集函数体中的所有局部变量(以var形式声明的变量),将这些局部变量存储到一个称为“活动对象”的对象里,所有变量都初始为undefined。

代码示例1 var fun = function(){2 alert(name);3 var name = ‘段光伟‘;4 }当执行这个函数时候时(fun()),函数体还没执行到,当前的活动对象为[{ name: undefined }],因此fun()执行的结果为:函数的[scope]属性:每个函数在定义的时候(生成函数实例的时候)都会分配一个[scope]属性,这个属性指向的当前的“作用域链”。

这个属性开发人员是访问不到的,只有javascript能访问。

作用域链:当函数调用时,javascript引擎会维护一个这次调用的作用域链,这个作用域链条是函数的[scope]指向的作用域链加上函数调用时的活动对象,形式如[ 活动对象, 函数定义时的作用域链条]。

代码示例 1 var a = 1; 2 //步骤1:[ { a: 1, outer: undefined } ] 4 var outer = function(){ 5 //步骤3:[ { b: undefined, inner: undefined } ,{ a: 1, outer: function } ] 6 var b = 2; 7 var inner = function(){ 8 //步骤4:[ {}, { b: 2, inner: function } ,{ a: 1, outer: function } ] 9 return a + b;12 //步骤3:[ { b: 2, inner: function } ,{ a: 1, outer: function } ]13 return inner();16 //步骤2:[ { a: 1, outer: function } ]17 outer();作用域链规则规则1javascript一般运行在一定的宿主中,每个宿主都会提供一个“全局对象”,或者叫“全局活动对象”,这个全局对象是所有作用域链的根节点。

规则2“取值操作”(如:alert(xxxVar))的规则是,沿着作用域链依次查找名称为“xxxVar”的变量,返回第一个找到的值,如果找不到就抛出异常(ReferenceError: xxxVar is not defined)。

规则3“赋值操作”(如:xxxVar = ‘段光伟‘)的规则是,沿着作用域链依次查找名称为“xxxVar”的变量,覆盖第一个找到的值,如果找不到就将“xxxVar”添加到全局对象中。

备注“闭包”这个概念就是通过“作用域链”实现的,而C#是通过编译器实现的,.NET并不支持。

Javascript,中的,“,作用域链,”,知识,分享,代

IIS7中的站点、应用程序和虚拟目录详细介绍

这里说的不是如何解决路径重写或者如何配置的问题,而是阐述一下站点(site),应用程序(application)和虚拟目录(virtual directory)概念与作用,已及这三个东西在IIS6与IIS7中的异同。

因为站点,应用程序和虚拟目录是我们在IIS上架设网站时肯定会遇到的,但它们的概念又是那么的含糊(至少对我来说)。

我在网上找了一些资料来学习,其中一个写的比较详细的是:Understanding Sites, Applications, and Virtual Directories on IIS 7而这里则只是作一些总结。

在IIS6中,应用程序和虚拟目录的概率是有点含糊的,而在IIS7以上,这三者则被规范化起来,在IIS架构层面上明确了三者的层次关系。

在IIS6中,虽然存在virtual directory 和application两个概念,而且看上去这两个概念是独立的,但是在IIS6中一个application其实就是一个虚拟目录,只不过一个application在medabase中可以对AppFriendlyName, AppRoot, AppIsolated, AppPoolID这几个属性进行设置而已。

但IIS6中的site则是例外,因为就算不对那几个属性进行设置,它也不会被视为虚拟目录,而是被视为一个application。

而在IIS7或以上(但目前我能接触到的最高版本的IIS就是win7中的IIS7.5),site,application和virtual directory的概念已经被规范起来,已经不像IIS6那样含糊。

在IIS7+中,他们是独立的概念,并且在IIS组织架构上呈现出一种层次关系:一个site中可以有一个或者多个application,一个application中可以有一个或者多个virtual directory,而一个virtual directory则对应着一个物理路径。

一个site默认会至少有一个application,称为根应用程序(root application)或者默认应用程序(default application),而一个application至少有一个vitual director,称为根虚拟目录(root virtual directory)来看一下我的IIS7.5上一个site的结构和这个site在IIS的ApplicationHost.config文件是怎样对应的。

: 注:ApplicationHost.config文件在目录:\%windir%\system\inetsrv\config目录下我的IIS中只有一个ID为13的site,site下有两个application分别为cd和dh。

从右边的config中可以看到,其实除了cd和dh两个application外,site本身也是一个application,也就是root application。

同时也可以看到,每个application下有一个 virtual directory,也就是root virtual directory,充当着这个application的根目录,并映射到该application所在的物理路径。

当然,每个application可以有多个virtual directory,这些virtual directory可以对应其他的物理路径(譬如dh application下的image虚拟目录的物理路径可以使网络中另外一台计算机的某个共享目录)在IIS7+中(其实IIS6也是一样,但细节有不同,这里有点含糊,还待深入研究),一个site运行在一个application pool中,而一个application pool默认有一个w3wp.exe(工作者进程),site中的application运行在这个w3wp.exe进程中的app domain(应用程序域)中(不同application运行在不同app domain中,以进行隔离),而同一个application的virtual directory运行在相同的app domain下。

但site下的application不一定必须跟这个site运行在相同的application pool,application可以指定一个跟这个application的site不同的application pool。

接下来独立的阐述一下site,application和virtual derectory站点(site)一个站点包含一个或者多个application和一个或者多个虚拟目录。

我们可以通过对site进行不同的绑定以用不同的方式对site进行访问。

这里的“绑定”包含两个方面,一个是绑定的协议,另一个就是绑定信息。

绑定协议用于指定通过什么协议去和该site进行通信。

IIS7+中,对一个site可以的协议包括http,https,net.tcp,net.pipe,net.msmq,net.formatname这几种。

当然,对于一个网站,最常用的就是http和https。

而绑定信息则定义了通信的基本信息,比如IP地址,通信端口,站点的一些头部信息(header)。

正如前面说到的,可以为一个site添加多种绑定,只需要在IIS中对某个site进行“编辑绑定”操作即可。

应用程序(application)application是为一个site提供功能的基本单位,例如一个购物站点可以包含两个application:一个负责呈现商品,给消费者去选购,并放入购物车,而另一个appliation则可以专注于用户的登录以及支付业务。

当一个site只有一个application时候,这个application也就是root application或者default application,代表着这个site本身,在applicationHost中的“ 下一篇:

加入收藏
               

.net中的Debug与Trace的调试心得

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录