如何更好更快的debug

debug

有人说web程序员不算是真正的程序员,刚听到这句话的时候很气愤,但仔细想想,这话还是很有道理的。可以说,大部分的web程序员不能算是真正的程序员,因为他们的大部分注意力在实现功能上,而对一些程序员必须要掌握的东西丝毫不在意。可以这么说,还不会爬就想跑了。
可能你不会同意上面的话,但问一下自己,除了改改例子实现功能以外,你对一些基本的东西有多少了解?先不说那些复杂的诸如面向对象一类的东西,我们就说说简单的排错、纠错吧,你做了多少?
想想看,作为程序员恐怕每天大多数的时间是在debug,但究竟有多少人真正掌握合理的、科学的去debug呢?以前的web编程语言象asp/php/cgi等关于debug的功能很弱,但现在的c#及java提供了丰富的debug手段,但你用了多少呢?你可能对System.Data.SqlClient的每个类、每个方法、每个属性都了如指掌,但你对System.Diagnostics了解多少呢?
现代的编程语言如c++ , java , c#等都十分重视对错误的防止、处理,在这儿我就讲一下在c#里的排错、纠错,希望大家能从中学到一些有用的东西,希望以后不会再听到文章开头那句话。
debug最理想的状态是什么?这个不用我说,那就是defect free,没有bug,呵呵。但早有人说了,没有bug那还叫程序吗?win2000还60000多个bug呢。所以我们要做到的是尽量防止bug,bug出现后能迅速定位问题所在,修正这个bug。.net提供了很丰富的debug手段,除了一些debug相关的nampespace,c#语言本身也有相关的内容存在。常用的有条件编译、try/catch、trace以及断言(Assert)等,如果你能熟练掌握这些手段,综合运用,那么debug将不再是一场恶梦,也不会像现在这样出现一点儿问题就满论坛追着人问:“我这儿又出错了,为什么呀?”。下面我将分别讲一下这些手段的运用。

一、捕捉异常(try / catch /finally)
这个我不用说,大家都清楚它的作用,就是捕捉程序中所有可能导致错误的异常,然后加入自己的处理措施,并且使程序继续运行,而如果不捕捉异常的话,程序将会终止,简单的把错误信息发送给客户。
所以,在进行所有可能出现错误的操作时都应该捕捉异常,象下面这个例子,捕捉数据库操作可能出现的异常。

/// <summary>
/// 取得数据库连接
/// </summary>
/// <param name="a_strDatabase">数据库名</param>
/// <param name="oa_objConnection">输出参数,空数据库连接</param>
public void GetConnection(string a_strDatabase , out SqlConnection oa_objConnection)
{
oa_objConnection = null ;
string strConnStr = "";
try
{
strConnStr = "server=" + m_objIni.GetProperty("server") + ";uid="
+ m_objIni.GetProperty("uid") + ";pwd=" + m_objIni.GetProperty("password")
+ ";database=" + a_strDatabase ;
oa_objConnection = new SqlConnection(strConnStr) ;

oa_objConnection.Open() ;

//log it
m_objLog.Write("数据库连接ok") ;
}
catch(SqlException e)
{
//log it
m_objLog.Write("数据库连接出错" , e) ;

#if DEBUG
Console.WriteLine(e.ToString()) ;
#endif//DEBUG
throw(e) ;
}
}

}//end class

二、条件编译
java不提供条件编译,这是我觉得java不好的一个原因之一,所以在写java时都是自己写一个类来实现条件编译。那么,什么是条件编译呢?就是当符合某一条件时编译,不符合时就不编译,这就方便了debug。我们经常遇到这种情况,在某一过程或方法里我们想要知道某个变量的值,比较常用的方法是在页面或控制台输出这个变量的值,已确定是否是自己希望的值,但如果没有条件编译的话,但当你发布发行版本时需要手工删掉这些输出语句,费时、费力,并且容易出错,而如果有条件编译,那就方便多了。看下面这个例子:
/// <summary>
/// 初始化
/// </summary>
private void Initialize()
{
try
{
m_objConnManager = new ConnManager(m_strIniFilePath , "./config/newsdata.ini") ;
log = new Log("./logs/newserver.log") ;
}
catch(Exception e)
{

#if DEBUG
Console.WriteLine("初始化" + e.Message) ;
#endif//DEBUG
throw(new Exception("初始化" + e.Message)) ;

}

}

注意到其中的#if DEBUG那几句吗?它的作用就是当DEBUG时,在控制台输出异常信息,以便你马上知道出现什么错误,而当不是DEBUG时,那句就不会被编译。

三、断言(Assert)
断言真是一个值得大书特书的好东西,但可惜的是80%的程序员尤其是web程序员不用它,甚至根本就没听说过。很难给断言下一个定义,如果要详细说它的好处,简直都可以写一本书了。简单地说,断言就是在应该是正确的地方加一个判断已确定它真的正确(这话有些拗口,下面我会详细解释),它的作用就是确保你的程序按照预计的目标正常运行,并且能够帮助你迅速定位错误原因。断言的机制很简单,就象c#里的断言方法System.Diagnostics.Debug.Assert的定义,判断一个条件是否成立,如果不成立的话就显示一条信息。看起来很简单,真的能起那么大作用吗?让我们看下边这个例子。

/// <summary>
/// 存取m_strID的属性
/// </summary>
public string ID
{
get
{
return this.m_strID ;
}
set
{
#if DEBUG
//断言
Debug.Assert(value.Length % 2 == 0 , "分类id长度必须为偶数") ;
#endif

this.m_strID = value ;
}
}//end method

这是个很简单的方法,就是为了存取m_strID这个成员变量的值,这个m_strID是个利用编码规则实现树形结构的字符串成员变量,就像这样:010213,两位为一间隔,通过它的长度和编码规则可以很容易得到它位于第几层,它的父节点的id等等。因为两位数为一间隔,所以这个字符串的长度必须是个偶数。
看到Debug.Assert那句吗?它的作用就是判断这个字符串的长度是不是偶数,如果不是,则谈出一个对话框来显示"分类id长度必须为偶数"。或许你会说看不出它有什么作用,不就是判断一个值符不符合要求吗。本来这个程序都是你自己写的,所以你给这个m_strID赋值时应该知道这个长度为偶数的限制,一般情况下应该都是正确的,好,现在让我们假设这么一种情况,由于某种原因,你忘记了这个限制,而把一个长度是奇数的字符串赋给这个变量,而这时虽然有问题但程序并不报错,继续运行,当过了很远时,这个错误显露出来,使整个程序崩溃或最终结果不正确,这时即使程序报错也是在离产生这个错误的真正原因很远的地方,或者干脆就不报错,这是你要找到错误的原因就很困难了,可能要花费几小时甚至几天的时间,而如果当时你加了断言,运行到这里的时候就会终止,告诉你错误的原因,也就避免了后面出现的问题以及你为纠正这个问题所付出的时间和精力。
怎么样,现在是不是对断言有了一定的了解,并且有一些兴趣呢?试一下吧,慢慢的你会感受到它的威力。另外需要说的一点是断言是为了辅助deubg的,而不是进行错误处理的,所以一般把它和条件编译结合使用,只有当编程、测试时才使用断言,而当发行正是版本时应该去掉断言,因为毕竟它是要影响效率的。

四、日志(log)
程序记不记日志恐怕是区分传统程序员和web程序员最好的标志了。大多数应用程序都记日志,而几乎所有的web程序都不记日志,呵呵。其实日志也是一个特别有用的东西,如果不记录日志,那很可能系统发生了什么、出现什么情况你都不清楚,尤其是时间一长,更容易出现这种情况。所以,养成良好的习惯,让你的程序写log吧。

当然,除了上述这些,还有很多东西,如跟踪(trace)单步调试等等,你可以自己看一下资料。
方法我都讲了,用不用就是你的问题了,呵呵。

时间: 2024-10-03 04:19:25

如何更好更快的debug的相关文章

iPhone 5八大特性解析:更大更轻更薄更快

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 [导读]升级为4寸屏幕,触感更灵敏.饱和度更高.厚度7.6mm,更轻更薄.支持LTE网络. 腾讯数码讯 北京时间9月13日凌晨1点,苹果在美国旧金山召开发布会推出了iPhone 5,iPhone 5所展现出来的特性和此前曝光的几乎完全一样,可以说这是最无悬念的一代iPhone. iPhone 5的特性如下: 1.升级为4寸屏幕,触感更灵敏.饱

怎么更好更快的学习seo网站优化

怎么更好更快的学习seo网站优化 1.灵活使用Google和百度等搜索引擎 很多朋友一定会说,Google和百度我都会啊,这个还要学吗?不就是在搜索框上输入自己想找的信息的相关关键字吗?这太简单了.如果是这样的话,请先回答以下2个问题.你知道Google和Baidu给站长的指南内容吗?在哪里?oogle和百度搜索的技巧你知道吗?在哪里有介绍? 如果要学习SEO,个人认为这两个指南先要找来看看,也应该找来学习.我们现在谈的SEO,基本上就是指针对Google或是百度的优化,像雅虎或是新出的BING

哪些工作可以更好更快地接触进而了解SEO

摘要: 很多做网络营销做SEO的新手大多都是没有经过专门的学习和培训的,大学里面也没有开设SEO的专业课程,绝大多数的个人站长都是因为有建站的需求,然后才着手融入SEO领域的,而非先 很多做网络营销做SEO的新手大多都是没有经过专门的学习和培训的,大学里面也没有开设SEO的专业课程,绝大多数的个人站长都是因为有建站的需求,然后才着手融入SEO领域的,而非先混迹于SEO再做站.不管是融入一个团队,还是个人单打独斗,我们都有一个融入SEO的过程,那么对于SEO没什么了解的朋友,通过哪些工作可以更好更

无人机如何才能飞得更高更远?

    现在的科技人士喜欢发现蓝海,更喜欢用文字把一些刚出来的行业涂上颜色颜料,真真假假的蓝海面积加起来快赶得上一个印度洋了,比如打车软件是蓝海,可穿戴设备是蓝海,K12在线教育是蓝海,安全手机是蓝海-外国专家的预言会在一定程度上刺激股市,著名的莫博士评测报告常常能影响一款手机的销量,以及华尔街对这家企业的态度:国内专家的观点因发表门槛较低,很难刺激股市,充其量刺激点击排行榜,毕竟,我们的科技媒体离真相比较远,也少人有人潜心做研究,以至于,我们要付出双倍的精力去阅读,一面吸收新的知识,一面还要付

创业3.0:站在成功者的肩膀上 看得更高更远

当年的冯军靠自己摸索学习创出了"爱国者"这个品牌,而如今的青年创业者们已经有了更好的导师在引领. 每天前往办公室的途中,柳传志总是会经过北京高校最密集的地区,日复一日,他不断看到一张张稚嫩的脸上挂着对未来的憧憬和迷茫. 全国每年有几百万大学毕业生面临找工作的难题,另外还有1800万就业困难群体,他们中很多人选择了创业.在北京中关村这片创业者的热土上,有成千上万的企业诞生,也有成千上万的企业消失. 美国摩立特咨询公司曾在全球20多个国家和地区做了一个关于创业状况的调查,中国有75%的人有

Vb.net2008做成的软件编译完才不到1M.运行支持软件却需要220M!!不可思议!做的安装软件,需要220M左右的软件支持,太庞大了,有没有更简单更小的软件支持就可以了?

问题描述 Vb.net2008写的程序做成安装软件,在其他纯净的系统中就需要220M左右的软件支持,太庞大了,有没有更简单更小的软件支持就可以运行软件了?象.Net2005需要FrameWork2.0只有20多M,还能够接受!现在是越做越庞大了! 解决方案 解决方案二:buhuiba你从网上下载一个,netframwork就可以运行了啊解决方案三:vs.net2008会自动生成的.生成的文件在Debug文件下221M.编译设置上我只选择了包含Framework3.5.装完后看控制面板里有Fram

海尔6段智能烹饪,让米饭更弹更香

大米是五谷之首,也是人体所需能量的重要来源.相信不少人都会选择使用电饭煲煮米.熬粥.用蒸煮米饭为例,好的米饭工需要具备5好:味道好,清香甘甜:看着好,晶莹剔透:口感好,有弹性,无夹生:闻着好,淡雅清香:营养好,释放充分,流失少.除了跟米种.蒸煮手法有关之外,这种5好米饭跟电饭煲的功用也很有关系.海尔电饭煲具有6段烹饪程序,三维立体加热,让米饭的营养充分释放,让并5好米饭成为用户餐桌上的"标配". 6段智能烹饪,让米饭更弹更香 海尔电饭煲的6段智能烹饪分别指的是:预约.升温.吸水.糊化.

苹果iPad 3电池更轻更薄 价格贵20-30%

北京时间9月7日消息,台湾<经济时报>昨天报道说,苹果iPad 3将配有更轻薄的电池,电池的价格将比iPad 2高20-30%.台湾新普科技和顺达科技是苹果组件供应商,提供iPad及MacBook电池组件,受益于iPad 3,它们的利润将提升. http://www.aliyun.com/zixun/aggregation/17683.html">机构投资者指出,iPad 3的电池将于明年一季度大规模生产,它已经重新设计,更轻更薄,而且续航时间比iPad 2更长. 另外,新的电

戴尔停售XPS 14 年底发布更轻更薄产品

继Adamohttp://www.aliyun.com/zixun/aggregation/17257.html">超薄笔记本停止销售后,戴尔还将停止销售XPS 14,而此时距离戴尔发布这款采用Core i5处理器.配备NVIDIA GeForce 400M的笔记本才刚刚四个月.一些细心的消费者首先发现戴尔的这款14英寸笔记本已经脱销,国外媒体Engadget随后向戴尔求证,一位内部人士表示,XPS系列的这个最小机型不会再回到市场上了.不过停止销售XPS 14的原因并不是因为这款笔记本不好

百分点让Kubernetes的操作更简单更便捷

文章讲的是百分点让Kubernetes的操作更简单更便捷,今年8月,百分点与云知声联合发布了Kubernetes分布式操作系统的"发行版":Sextant.Kubernetes是Google开源的集群管理系统,其存在的主要意义就在于改善集群管理环境,提升管理效率.近日,在北京召开的CNUTCon 2016全球容器大会上,笔者有幸见到了百分点的技术副总裁刘译璟,听他谈谈百分点对于Kubernetes应用与发展的观点. 今天很多互联网公司的集群的CPU总体利用率在20%以下,即便是在采用了