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

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

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

图形整体拉出效果-Delphi资料 一个实用的Delphi屏幕拷贝程序的设计 用Delphi 显示122种图形特效 用Delphi编写DLL实现动态改变分辨率 用Delphi进行OpenGL编程学习心得 用Delphi开发windows95屏幕保护预览程序 用Delphi实现壁纸更换 用DELPHI实现位图显示特技 用DELPHI中Canvas特性开发图形软件 用构件变换法实现动画效果-Delphi资料 在Delphi中使用动态图标 在Delphi中显示Windows图标 在多媒体文件中批量抓取图象-Delphi资料 怎样读出不同格式图形的高和宽-Delphi资料 怎样使用PageUp、PageDown滚动窗体-Delphi资料 怎样制作全透明的窗口-Delphi资料 DELPHI:FormContainer简易手册 Delphi:用FormContainer渐变效果 Delphi4的窗口融合技术 Delphi使用技巧ABC Delphi使用技巧四则 DELPHI中自适应表单的实现 TList的用法-Delphi资料 不规则窗口的实现-Delphi资料 不用标题栏也移动窗体-Delphi资料 窗口建立和关闭时的特效-Delphi资料 窗口中状态行的显示-Delphi资料 动态提示的可视化实现-Delphi资料 动态修改显示器分辨率-Delphi资料 对数据库中的数据进行处理-Delphi资料 改变壁纸-Delphi资料 to: nononono(null,null),再来! 导入的数据,字符型输出为乱码在oracle8.05中,如何解决?谢谢! 做设计文档时,是先进行详细设计还是数据库设计? csdn我爱你........ oracle8.05中如何察看记录?谢谢! 哪位兄弟见过可以收发邮件(SMTP)的源码,做成动态连接库的那种。别的程序可以调用 关于tedit控件(很弱智的问题,但是小妹妹我就是不会做) 请问一个简单的条件是用Ttable的filter还是Tquery? 选DCOM还是CORBA? 倒库出现的问题 寻求怎样写SQL语句的教程 JNI的问题: dll文件放在哪里能被servlet调用到? 好不容易收到第一份海外定单! 问ListCtrl的item上的右键菜单 怎样求出一个点的坐标??????急急!!!! 请大家看一看这个分页程序,为什么在页数大于20时,按下一页时下面的页数还是显示的1~10页!!谢谢!! 我的linux在放mp3時總愛死,為甚麼? 唉,弄了好几天了,如何解决?????????????? 请问哪里有免费的PHP+MYSQL主页空间呀! 大家快来帮忙:数据库的一个小问题 我现在想学一门新技术,不知道是学VC++,JAVA,还是刚刚出来的。NET技术呢?请高手指点呀。 高分征解:一个动态提示窗口的问题,给出答案必定给分!!!求救我啊!! 在这里赚分真不容易呀! 怎样检查FORM中CHECKBOX和RADIO的值呢 那里有在asp中操作word对象的详细教程? 请问:如何得到TForm的窗口句柄? authorware中的按钮。 哪里有发送mail成功的php程序!! 关于上传数据的一个特殊问题,有点难 怎么用OLE实现与手机的通讯?? 汉语分词算法 grid显示问题 成为Delphi高手须看哪方面的书籍,请高高手指教? 关于属性页的小问题? 为水园增加点正气: 大家都是斯文人吗,呵呵||||| 诗经国风2001版----之桃夭 高手高手教教我 +++++++++++++一个很奇怪的问题************* 请问:有没有专门介绍C++函数使用的书籍? 提個有點難度的問題.看問題的有獎. 高手请看:这语句错在哪? 哪儿有dos的原代码? 谁能平息这几天水园的争端^^^^^^^^^^一个详和的水园^^^^^^^^^^^我只能拿分支持 为何显示黑乎乎的一片,chick!!!!!!! 原来女人也好色,欢迎MM。 心芯蕊~来拿分~~~~MM要分能不给吗??砸锅卖铁也要给啊!~~~~55555,可怜我的分啊~~~~~~~~~~~ 着急??一小段代码!!谁来看一下?? 男子汉说到做到,我在此特地向一位女士道歉 高分求救!急急! ! ! ! 奇怪,编译DIRECTX例子正常,新建一工程后改写主文件后运行BltFast函数为何这样? 急求高人!不简单:关于common dialogbox控件的问题? 怎样学可视化编程? 给9.8克氯酸钾加热,完全分解能产生多少摩尔氧气 写出下列变化的方程式 cu-----cuo-----cuso4-----cu(OH)2----CU 实验室用含有二氧化锰的氯酸钾制取氧气的化学方程式quickly 实验室需要22.4L氧气做实验,需要多少克过氧化氢完全反应?(氧气密度为1.48g/L,保留到整数) MnO2和KClO3受热分解成什么 快点告诉我 在线等 谢谢啦 氯酸钾和二氧化锰混合物制取氧气的化学方程式 2.4g的镁完全燃烧需要多少升氧?氧气密度1.4g/L 求需要加热的化学反应方程 和需要加催化剂的化学反应方程Q1弱酸的水解和电离需要可逆号还有除了 F2以外的卤素与水反应也需要?Q2需要加热的化学反应方程 有那些?Q3需要加催化剂的化学反 用12.25g的KCLo3制氧,加入少量高锰酸钾,加热后共产生氧气4.96g,问加入的高锰酸钾质量为多少克? 实验室现需1.12L纯净的氧气(标准状况下,氧气密度是1.43g/L),某同学加热氯酸钾和二氧化锰混合物制氧气,并回收二氧化锰和氯酸钾,下表为实验的有关数据:实验收集所需1.12L氧气后试管内固 KClO3与MnO2的反应方程式 KClO3 加热可以制成氧气吗,还是只能加二氧化锰,或是同时进行? 完全分解5%的过氧化氢溶液680g,可制得氧气多少克?合多少升?(标准情况下氧气的密度为1.43g/L) 求KCLO3与MnO2共热的方程式 加热分解49克KClO3反应完全后,可得到多少摩尔的氧气 实验室需制取3瓶氧气,每瓶氧气的体积为250ml,需用多少克过氧化氢氧气密度为1.429g/L 相等物质的量的KClO3反应:第一种方法:有MnO2,受热分解得到O2.第二种方法:加热至470摄氏度,得到KClO4和KCl.下列不正确的是 DA.都是氧还反应B.还原反应元素相同C.氧化反应元素不同D.生成KCL物 KClO3和MnO2共100克 混合后,其中MnO2占20% 过一会MnO2占25% 问生成氧气多少克? 实验室用34g双氧水最多可制得氧气多少克?在标准状况下,其所占体积又是多少升?(密度 )氧气的密度为 1.429g/L 实验室常用Kclo3和Mno2在加热条件下制取O2求1.反应物和生成物的物质的量的比是多少?2.12.25gKCLO3完全分解,可制得氧气多少摩尔? 将A克MnO2和3A克KClO3混合加热制取氧气,至不再产生气体为止.冷却后称得剩余物质为B克,则产生氧气为____ 实验室要用氯酸钾和二氧化锰加热制氧气,要制取96g氧气需要多少克氯酸钾分解才能制得? KClO3与MnO2制取氧气化学方程式 已知加热KCLO3和MnO2混合物反应放出O2,在10gKCLO3和MnO2的混合物中,含MnO2 10%.加热后冷却,试管中剩余固体含MnO212.5%,求KCLO3分解的质量分数 实验室用氯酸钾制氧气还有FeO和Fe2O3有什么区别 实验用KClO3和MnO2制O2,现需9.6克O2,则需要多少KClO3分解 实验中加热kclO3和MnO2的混合物制取O2,若要收集448ml(标准状况)O2,发生反应的kCL3的质量是多少? 将0.04摩尔氯酸钾与二氧化锰共热,完全分解时可生成氧气___________摩尔,相当于生成氧气___________克. MnO2和HCl反应制Cl2的化学反应方程式怎么写? 实验室制取O2,常用加热KCLO3和MNO2混合物的方法 用30克氯酸钾和5克二氧化锰制取氧气,反应后,得到25.4克固体,生成氧气几摩尔? kclo3和hcl反应生成cl2与clo2比为1:4,请写方程式快 实验室用KClO3和MnO2混合物制O2,当MnO2含量从2%变为3%时,问有多少KClO3分解 实验室用氯酸钾和二氧化锰混合物加热制氧气,反应前后二氧化锰的质量分数(变小,变大,不变)要原因 KClO3与浓HCl反应生成Cl2的化学方程式 实验室加热kclo3和莫mno2的混合物制取o2,若要收集448ml(标况)o2,球发生反应的kclo3的质量是多少?一定要详解. 实验室加热4克氯酸钾和二氧化锰的混合物来制取氧气,当加热到不再产生氧气时,剩余固体物为3.04克,求 1.生成氧气多少克?2.原混合物中氯酸钾和二氧化锰各多少克?3.若改用加热高锰酸钾来制 kclo3生成O2的化学方程式 a克KClO3与b克MnO2混合后,充分加热,得剩余固体c克,则生成O2的质量为___,KCl个质量为------- 实验室用氯酸钾和二氧化锰制取6mol氧气,问同时生成氯化钾多少摩尔?生成氯化钾多少克 【急】一道初三化学题:实验室用加热KCLO3固体的方法来制取O2...实验室用加热KCLO3固体的方法来制取O2,为了加快反应速率,常常加入催化剂,已知下列物质都能加快此反应:(1)Mn (2)MnO2 (3)K 现有Ag kclo3和Bg mno2的化合物,加热到质量不在减少为止,得到剩余固体Cg则反应生成O2的质量是多少克同时生成氯化钾多少克请回答,我很急,今天作业(八年级下册) 氯酸钾加上二氧化锰生成氯化钾和氧气时的化学现象?KClO3(MnO2)→KCl+O2↑ 还有高锰酸钾加热生成锰酸钾,二氧化锰和氧气的化学现象!还有碳酸钠加上氯化氢生成氯化钠,二氧化碳和水的化学 写出下列转化的化学方程式:(1)KCLO3→O2→P2O5 (2)H2O2→H2O→O2→CO2写详细点 氯酸钾和二氧化锰共热制取氧气,混合27.6g氯酸钾和2g二氧化锰加热制取氧气反应停止后测得二氧化锰质量10%剩余固体质量?制得氧气的质量? 氯化钾和二氧化锰生成的氧气里有二氧化锰里的氧气吗 KCLO3在一种催化剂的作用下,借助摩擦产生的热放出O2,同时生成氯化物的化学方程式 氯酸钾制取氧气用二氧化锰作催化剂加热后能否立即产生氧气 取制1mol的氧气要多少氯酸钾 下列物质 起颜色相同的一项是 A Mno2 Cuo B Cu(OH)2 Fe(OH)3 C Mgo Fe3O4 D CaCO3 CuSO4 加热氯酸钾和二氧化锰的方法制取氧气的化学方程式是什么? 若有0.1mol纯氯酸钾,可制得氧气多少mol Cu、CuO、CuSO4固体、CuSO4晶体、CuSO4溶液、Cu(OH)2、MnO2 这些物质的颜色 用二氧化锰作催化剂,加热氯酸钾可以制取氧气,怎样证明氧气是由氯酸钾分解生成的, 用氯酸钾制备氧气,若要制得标准状况下的氧气33.6L,至少需要氯酸钾多少摩尔?相当与氯酸钾多少克?麻烦把解题的步骤写下来 还有解题思路 最好能完整 具体一点 1、Cu\CuO\CuSO4\Cu(OH)2分别各是什么颜色?这四种物质加入到稀硫酸中得不到蓝色溶液的是?2、将一种金属投入稀硫酸中呈现a.有气泡冒出 b.有沉淀 c.无现象 这三种现象中哪种金属活动性最强、最 氯酸钾制取氧气二氧化锰是不是催化剂 给9.8g氯酸钾加热完全分解能产生多少摩尔氧气?要得到相同质量的氧气,需要分解多少克高锰酸钾? 用氯酸钾制取氧气MnO2 CuO如何比较这两种催化剂的催化效果 用氯酸钾和二氧化锰制取氧气的化学方程式
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn