说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

编程调试和诊断的五大规则

HTML文档下载 WORD文档下载 PDF文档下载
在编程过程中,调试和诊断如影相随,以确保程序的完美运行,这就像是一门艺术。本文详述了调试和诊断的五大规则,包括编程前后的不同事项。分享给各位程序员,希望能对你们有用。

导读:Micheal Shallop是一位资深的Web开发者,软件工程师。6月21号在DZone上发表文章The Top 5 Debugging and Diagnostic Rules for Programming,分享自己多年的工作经验。下面是编译内容。

在我的职业生涯中,不管是系统开发、系统设计、还是系统调试,我都是这些方面的专家。对于我的成就,我很自豪。后来我大部分时间都花在系统检查上。“系统崩溃了”是我经常听到的话。

在一个进行了三年的项目里,我没有任何假期,甚至没有脱产培训,外出都是带着笔记本电脑,以便于每天早上可以检查头天晚上的运行结果。这种紧张而有序的工作情况恐怕不是所有人都能想象得到的。花在技术支持上的时间可以帮我磨练诊断技术——想想看,您正在安装一个你根本看不到的系统,还要和远程专家进行交流。时间久了,技术就是这样慢慢积累起来的。

还是来说说重点吧,在这些年的工作当中我已经学到了很多编程调试很诊断的东西。我目前的任务是编写一个后端数据系统,100%的可伸缩,水平和垂直方向的,使用的是开源服务项目,例如mongo,mysql,rabbitmq和memcache,框架是由我编写的100%PHP。当别人看着我设计出来的系统的时候,我能从他的眼里看出羡慕的眼神——这是知识的力量。可是你有没有发现,现在的高校仍然缺乏在软件/系统调试和诊断方面的综合性专业。

调试的方法主要是目标访问、运行控制以及实时跟踪。调试问题贯穿多种多样的系统,集成开源系统,或者在你自己的代码之间,这就像是一门艺术。在过去的几十年里,我编译了关于诊断技术的非正式列表,很荣幸与你分享。

Rule 1—最后的更改可能会让整个项目前功尽弃

在我做电话技术支持(Pre-Web)的时候,我学到一件事情,如果你花足够长的时间去聆听客户的话,那你就知道怎样解决客户的问题。在大部分情况下,如果系统或软件突然停止工作,原因可能是你在运行环境里做了一些改变,不论是配置还是代码,都会对系统的稳定性有很大的冲击。

一旦你取消改变的项目,重新运行,恢复旧的数据库,撤销程序包,看看系统/软件是否继续工作?如果继续工作,那就能知道是什么导致系统漏洞,同时还可以找到系统崩溃的切入点。

你可能会很惊讶,经验丰富的程序员或管理员会不会经常忽略这条规律?其实,如今的软件是很稳定的,基本上不会自行变动。一旦它突然停止,就必须判断原因是什么,为什么会出现这样的问题。有可能是你作了一些变动。如果没有,就询问团队是谁安装了最后一段程序或谁意外的改动了文件权限等等。

最后要检查的,就是你最先修改的东西。

Rule 2—复制问题

针对软件开发,如果要诊断一个问题,那首要任务是重新把这个问题制造出来,才能从根本上了解并解决问题。有可能需要你真正参与进来:让终端用户确定他们所做的事件的确切顺序,以便能够产生同样的错误。

作为一个软件工程师,在不知道具体问题的时候修复代码的确很难。所以说,在这种情况下,你就不得不重新制造同样的问题。

如果同样的动作产生不一致的结果,比如说,工作第一次,第二次就不工作了,接着第三次第四次第五次都工作,但第六次又不工作了。问题可能出现在数据上,并且需要检查运行时间配置选项、有效载荷、输入和结果。代码不是关键问题,因为代码每次都是以同样的方式执行的。

当然啦,通常情况下也会有特例,不过这些年特例变得越来越罕见了,因为电脑都已经配备了保护内存的功能。数十年前,我讲过一堂内核崩溃分析的课程。稳定就是点动鼠标的一系列顺序,给鼠标驱动程序重新编码,通过内存分配将接收到的顺序输入打印机驱动程序,当发布一个打印命令的时候——核心转储!

如果你能连贯地复制问题,那你就有能力处理代码问题。

Rule 3—找出原因,而不是症状

因为系统都是互相联系的,沿着错误的道路诊断问题是最常见的错误,这被称之为“连锁反应”,软件或系统里的问题能够体现在不同的区域,挽回软件的质量只是问题的表面。当问题露出水面的时候,需要仔细想一想:我是要处理问题呢,还是处理看到的症状呢?

当处理一个问题的时候,你只是在问题上兜圈子,你必须停止您的心理过程,只需简单地确定你所处理的问题是表面症状还是有因果关系的。

Rule 4—要有信心

我曾经教过非传统的学生如何开始编程,他们当中的一些人认为电脑是智能的,恶毒的,有密谋的,诡计多端的,阴险狡猾的,看上去就像是一个充满恶作剧的盒子。

电影Short-Circuit(霹雳五号)里有段台词:

它只是一个机器,施罗德。它不会生气,没有快乐,不知道难过,不会嘲笑你的笑话...它只会运行程序!

人们往往忘记了这一点,在软件完美运行第一次之后,只要提供相同的数据和稳定的运行环境,那它就能一直完美无缺的运行下去。如果在两个对话窗口完成了测试,却在第三个窗口上失败了,其实不要浪费时间检查代码,因为问题不在软件上,而在第三个对话窗口的环境配置上,或者是输入的数据有问题。

不幸的是,能够发现基于软件问题的技术精英实在是很少,因为他们知道这方面几乎所有的问题。

“服务器有问题。”

“软件有问题。”

有些看上去深入的观点其实并没有经过分析。你千万不要因为别人这样的评论而分心,不能被别人误导,更不能动摇自己的立场。尤其当你是负责调试/编写系统或软件的带头人/开发者/管理员的时候。你必须有信心,坚信你的代码、平台和数据库在给出一致的输入和稳定环境的条件下,每次都能在相同的时间内完成运行。

当然,从表面上看,软件或系统可能是“有问题的”,但这并不表明只需简简单单的处理代码块——而是要分析问题范围,了解前置条件,数据源的完整性和输出质量。如果所有的项目都如设计的那样保持一致性,那你就应该看看对话框以外的地方,说不定问题根源就在那里。

Rule 5—记录,记录,再记录

记录在一个开发环境不能被滥用。通过记录,当然,我指的是诊断或提示性信息嵌入到代码库的输出,提供一个初步的问题确定性。要有频率、长时间的记录。

记录信息不仅仅提供洞察代码的问题区域,还给你提供自信——一切都按计划执行/处理/计算,一切都在监控中。记录工作同样可以告诉你这个查询、计算和方法都是成功的。

就我个人而言,我总是硬编码两个级别的登录作为代码的子程序。我经常在每个方法的入口点编写跟踪输出的代码,而且以关键决策点的出现作为条件编写调试代码,然后可以使用我的记录输出手段跟踪程序流,同时关注临界值。因为这些都是运行时方法,系统配置里单独的Boolean可以控制所有的跟踪,所以在非开发环境中信息发送功能是受限制的。

此外,拿记录PHP为例,有一个全域常数:__文件__,__线性__,__方法__和__功能__,这为你提供一个信息记录模板,还有一些其他模板:


随着开发的继续,你的硬编码行数将迅速变得毫无意义,除了搜索键还有点用。编写记录代码要用到所有的信息和有效代码相关的东西。


如果你想知道不同的记录等级之间有什么区别,那我建议你阅读文章10-Commandments of Logging。你可能并不赞同文章里的观点,但我保证你肯定会下决心改变之前的记录方法。

奖励制度

和二十年前我们普遍使用的工具相比起来,今天年轻的程序员使用的先进工具是经过我们不懈的努力创造出来的,这段美好的回忆将是在这个相对年轻领域里奋斗过的前辈们最好的礼物。我的第一个调试工具是printf()和(sh),然而当打印机被广泛使用的时候,转存一个50000-line C-code列表到折叠式记录纸上,一个红色的毡笔头和大量的走廊空间成了我的调试器。

现代调试器是你的朋友,你的得力助手,能够向你的老板证明你简直就是个天才——它允许你在开发阶段分步调试代码和发现问题。不但能分步调试,附加变量监控,还能跳回堆栈,一切都是那么简单,听起来有点不可思议!

总之,如果你不想开发使用调试器,那建议你抽时间给你的IDE安装并配置一个调试程序包。用过你就会很惊讶,如果没有调试器,你该怎么编码?

总结

调试是一个习得的技能,所有的要点都已经在上面提到了,但这也不一定对你有帮助——如果你不知道你的系统,不了解你的应用程序或者是不懂电脑科学的基本规律。

英国科幻作家Arthur C. Clarke说过:任何非常先进的技术,初看都与魔法无异。

对于那些才疏学浅的人来说,观看优秀的开发人员或系统管理员解决复杂程序问题简直就像是玩魔术!真希望那种感觉会激励你努力学习必要的技能来加入到魔法行列。

原文:DZone

clearInputs()-JQuery API fieldSerialize(true)-JQuery API fieldValue(successful)-JQuery API formSerialize(true)-JQuery API formToArray(true)-JQuery API resetForm()-JQuery API $.recallDroppables()-JQuery API $.SortSerialize()-JQuery API Draggable(hash)-JQuery API DraggableDestroy()-JQuery API Droppable(options)-JQuery API DroppableDestroy()-JQuery API Sortable(options)-JQuery API SortableAddItem(elem)-JQuery API $.meta.setType(type, name)-JQuery API data()-JQuery API disableTab(position)-JQuery API enableTab(position)-JQuery API tabs(initial, settings)-JQuery API triggerTab(position)-JQuery API triggerTab(position)-JQuery API Tooltip(settings)-JQuery API PHP简介-PHP初学入门教程1 选择PHP的理由 -PHP初学入门教程2 从一个简单的程序来了解PHP -PHP初学入门教程3 PHP语法基础 -PHP初学入门教程4 建设一个简单的交互网站(一) -PHP初学入门教程5 建设一个简单交互的网站(二) -PHP初学入门教程6 建设一个简单交互的网站(三)密码验证 -PHP初学入门教程7 PHP文件上传 -PHP初学入门教程8 为站点添加投票功能 -PHP初学入门教程9 有关Builder版的兄弟定期进行网上技术交流的倡议书! 急!关系到我是否找到工作,请回答 如何根据Form的大小调整控件的大小 闪盘的另一个分区不能用了!!在线 连接数据库的疑问,盼望解答!! 急!急!急!请教一个共享的问题? 请问哪里有Class类和Method这两个类的说明呀!谢谢! 怎样打开CSDN电子版 请推荐一下有关于JAVA,JSP,JAVASCRIPT相关的好书 汽车与电脑谁重要(转) 转让 全新飞利普 820 彩屏手机一部(个人) 请问是否有可以统计数据的电子表格控件? 给点看法? 是不是来这里的人混得好的不多,搞得我都不敢跳槽了 倒霉就一个字,我只说一次。 一个关于Delphi的简单循环外提(编译优化)的测试,有兴趣进来看看 大家遇到这样的问题了吗? DTPicker的问题,急急急!!!! sun的ultra5启动时显示没有键盘设备,可能是键盘坏了,哪里能找到这种8芯的鬼键盘? softice调试时出现的有意思的问题 怎样终止一个函数? 关于j2ee的几个问题 谁有数值计算方法与c语言工程函数库的代码,急!!! 麻烦有项目开发经验的大虾进来看看,给项目估个价!谢谢! 急!!大问题!!求助!!发扬你们的美德吧! JAVA的配置问题 菊花在水里跳舞!!! 用什么来写啊!!!jdk还是jbuilder TP-LINK的RTL8029(AS)芯片的网卡怎么装? w32dasm怎么把程序中的中文字符串反汇编成指令了呢? 曾用B/S四层结构开发过OA的,请进!! sql语句的问题? 关于QUERY->SQL的赋值 c++学习中的问题,拿来和大家一起讨论。 求助!要写一个MP3的播放程序~~ Project Settings里面的设置怎么设为默认值,让以后新建的每个工程都适用? 怎样读取数码相机的照片,并将它存入sqlserver数据库中(100分) VB6菜单设计器设计的菜单跟到WINDOWSXP下面,会自动变成XP类型的菜单吗? 请问openpicturedialog的用法? 紧急求教:ScktSrvr(Borland Socket Server)设置问题????????? 关于com与asp的疑惑 怎样读取数码相机的照片,并将它存入sqlserver数据库中 JSP里连接DB2的疑问? 为什么dbgrid的网格颜色属性的更改不是每次都可以。 请教名位大虾!~怎么安装.NET?今天刚买的,却不会装,七张光盘的!~ rose 的问题, SELECT 语句中的WITH TIES作用是什么? 西南交大 农历这么转换成公历?UP有分!急用!问题解决马上给分!不够再加。 关于数组的问题!在线等,谢谢了 不从新发送信息,则无法刷新页面!!! 一辆车去某地,去时每小时行驶36千米,六分之五小时到达,回来时用了五分之四小时回来时平均每小时行几千米? 酸甜苦辣咸是人生的五味,请选择一味作为作文写下来,600字左右求专家回答啊 娃娃鱼怎么繁殖? I'm surprised to see you drink so much.you ____.A.used to B.didn't use to C.weren't used to 酸甜苦辣咸是人生五味(其中一味)作文250字 娃娃鱼怎么养殖 has在什么情况下用?the child 后面为什么是have? 请问我一个星期吃一包100克的薯片,这样会胖吗?我一般都是吃乐事的!还有,吃寿司容易胖吗?我很喜欢吃的~寿司应该与其他食品相对,热量没那么高吧?好像日本人也不是很胖吖~ 如何因材施教教育过程中如何做到因材施教?教育学中的问题… 当飞机空投救援物资时,为了能把物品准确投到受灾地区,应该怎样投掷,为什么 英语:1.有篇英语课文的题目是Candy helps?为何不是candies?2.disturb发音?是第四特,还是第四的?3.a stick of中的stick是什么意思?4.Drifting is all part of kayaking?part为何不加s?5.I will teach you to“Eskimo roll”. 动物与动物之间可以沟通吗,为什么? I think Tom can't play chess well?哪里错了? 《三字经》中有关不耻下问的句子 动物之间是怎样交流的? do you play chess well 世界上的哪个地区主要为阿拉伯人,信奉伊斯兰教?如题 人生五味除了酸甜苦辣咸还有那一味吗?还有读书是那三味呢? 甲乙两车同时分别从ab两地相向而行,甲走到全程3/7的地方与乙相遇.已知甲每小时行80km,乙走完全程 中关于"不耻下问"的句子是哪句?快 人生五味——酸甜苦辣咸分别代表什么? 甲乙从AB两地同时相向出发,甲每小时行80KM,乙每小时行70KM,甲行全程2/5,乙离还有36KM,AB两地是多少? 三字经中哪句话和不耻下问有关? 一种薯片的名字基本都是红色包装 ,正面包装左下角有一个戴着厨师帽子的黄色人物 ,口味写在正面右下角,薯片形状是有一条一条的波浪形,不是平平的弯曲.产地应该是大陆的. 9._____________ to hurt her feelings,he did not tell her the truth.A:Not to want B:Not wanting C:To want not D:Wanting not 提起"不耻下问",想起中哪句话 it is wise to look ahead but foolish to look further than you can see 英语语法高手请进:You will regret ___those words.You will hurt her feelingsYou will regret ___those words.You will hurt her feelings.A.saying.B.to say C.having said D.to have said 那些昆虫属于鳞翅目?蝶和蛾类我已经知道 ; 曹丕为什么字子桓?“丕”和“桓”之间有什么联系? 甲乙两车分别从ab两地相向而行,甲车每小时行80km,乙车每小时行全程的10%,当甲车距离B地的路程与已行的路程之比是1:5时,乙车再行全程的八分之三到达A地,AB两地相距多少千米? 关于区分昆虫鳞翅目、直翅目、膜翅目的方法 谁能报出20种动物名称 靠卵繁殖后代的动物叫什么?叫卵生. at night 同义词组是什么?which subject do you like best 同义句是什么?另加一题:under 表示(数量,级别,位置,年龄)低于,少于,在...之下时,同义词是什么? 三国杀中,曹彰阵亡台词:“子桓,你害我!”,曹丕阵亡台词:“子建…子建”,这两句台词有什么寓意呢? AB两地相距510千米,甲乙两车分别由两地相向而行,若两车同时出发,则5/1/10小时相遇;若乙车先出发2小时,则甲车出发后4小时相遇,求两车的速度 用杜甫自己的诗来概括杜甫的一生,求速度啊 曹丕是魏文帝吗? A、B两地相距510千米,甲乙两车分别由两地相向而行,两车同时出发,则5.1小时相遇;乙车先出发2小时,则甲车出发后4小时相遇,求两车速度(方程) 什么名字有中东色彩?阿拉伯人的姓氏构成? 曹丕称帝后,大臣们都叫他陛下,有时候他还摆架子.而太后叫他子桓,或者直呼其名,曹丕还得下来行礼. We l----- like each other very much and we like to help each other. AB两地相距510千米,甲乙两车由两地相向而行,若两车同时出发 则5.2小时相遇若乙车x先出发2小时,则甲车出发4小时后相遇,求两车的速度 He has two sons ,one is a doctor ,the other is a teacher.one.the other .是固定搭配吗? so we miss each other very much的中文意思 孝敬父母.是中华民族的美德.嗯三字经中就有这样的描述,___,___孝于亲所当执 you have also been to beijing 和 you also have been to beijing 这两个句子 哪个正确 还说 都对also 的用法有什么 规则 比如说 经常在什么词 的后面 前面 根据句意填空.Ann and Joan are( 1 ) .They look( 2 ) each other very much.People often ( 3 ) that Ann is Joan or Joan is Ann, ( 4 ) it's to tell the difference.上面一句的t's和to之间还有一个空,第二句以下为准。People family是可数名词还是不可数名词?如果它是不可数名词,那为什么又in a happy hamily之说呢?I hope I can get the best of all.Thanks a lot for your help. Not only__to Beijing,but I've also climbed the Great Wall.A.I have been B.have I been 该选哪个? the,can,read,school,boys,picturebooks,at连词成句 Family是可数名词还是不可数名词?老师们说可数不可数都一样,都写family;我查一些书,书里说是可数名词,复数的话是families;而电脑上有人说可数,有人说不可数,到底是什么呢? Have been tough love ,After also 如题Have been tough love ,After also nor do we write to each other very much中的do有什么作用是强调作用吗? family什么时候用可数什么时候不可数 I,_______ ,have been there twice.A.too B.also C.already D.either 选什么? l连词成句 class ,see,photo,my,school,in,can ,at,you,the 五味人生(酸甜苦辣咸)的作文其中的一味的作文 外星人能理解人类的肢体语言吗?一个好奇的想法.为什么电影的外星人能理解主人公的肢体语言~ 美男子遭遇车祸脑部创伤不能交流 女友调查总结女性二十“怕”普京力压奥巴马当选《福布斯》全球最有格鲁吉亚警告:别政治化冬奥会法国情侣将女婴弃于轿车后备厢 涉虐待媒体称比尔·盖茨西雅图豪宅的新邻居多《斯大林格勒》曾欲邀周润发,片酬过高美国被爆在驻华使领馆搞监听 北京上海王毅与福田康夫会谈引关注 日媒称或成意邮轮沉没事故发生时船长与情人在船上中国将继续积极支持和参与联合国维和行土耳其否决“采购中国红旗导弹”的早前新媒:记者陈永洲被批准逮捕 舆情急转日媒:“西进战略”对中国崛起产生重大混装的货车收费站附近爆炸 幸未造成人货车上高速大灯出故障 司机打着手电开借给朋友的豪车撞车后烧成空壳 司机居一脚油门跨过四级台阶 轿车冲进武林路女司机高速追尾车毁人伤 罪魁就是脚上美媒:美国“重返亚洲”战略让中国从中英媒:长期天然气短缺加剧中国空气污染浴血苍穹 飞虎队翻译员的战争回忆江苏一男子暴打4岁儿子致死被刑拘遭抢中国商务团返程 团员讲述南非惊魂原标题:村主任出门抗台风 数分钟后自假冒伪劣食盐案件上升 江苏开展“雷霆张娜拉遇车祸未受伤:请不要担心我(图尚修堂:宁泽涛夺冠具有极重要的国际影北京发高温蓝色预警 明日城区局地可达北京:男子为泄私愤用弹弓钢珠击碎多家湖北老鸨跨省指挥\"交易\" 泰州警33岁前女友强行住进自己家 5旬男子江苏破获一特大假盐案 涉案食盐2万余仪征警方破获特大炒股诈骗案 300余夏季吃烤串应警惕布鲁氏菌病太和3名少女被拐至色情场所 6天后遭抢中国商务团返程 团员讲述南非惊魂合肥野生动物园4只双角犀鸟11日首次南京珍藏受降文物炙手可热 中外机构争泰国迎来大象日 民众与大象共享节日欢男子为泄私愤用钢珠击碎多家住户玻璃“憨警”张超:两年参与破获重特大刑事
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘