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

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

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

一周消息树:百度“涉黄”遭警告,网盘内容审核的四种方式 微信开发商现状调查:接口限制成主要困扰 行业需求多样是最大难点 小米:海外扩张需谨慎,信息安全或成最大掣肘 AMD FX系荣耀归来 或成大众新宠! 脑洞大开:《80天环游地球》同名游戏诞生记 2014微信开发者大会 最后30个参会名额! 林仕鼎创业产品“云校”正式上线:让教育个性化、多元化、均衡化 14岁少年开发者:伍兴云的智能家居“梦” Xcode 6 Beta 6发布闹乌龙,着重改进Swift语言 当API遇到云平台,开发者面临的新抉择! 《近匠》欧朋流量宝,工具类应用开发之道 《近匠》Bmob:免费无限制的公有云服务 MDCC应用征集最新动态:3D手游成热点、硬件种类丰富 闪迪Ultra II SSD:采用TLC闪存,最低价为79.99美元 现有技能不浪费!基于Titanium的跨平台游戏引擎Platino 跳过开发者,专注补Bug的iOS 8 Beta 6悄然发布 集群管理可以很简单,Google又放大招 应用内直接打车:Uber面向第三方开发者开放API 百万美元巨奖!英特尔启动感知计算挑战赛 IBM 2014技术峰会在京开幕! OpenGL 4.5规范标准发布,大大提升API性能! 更萌更贱:Flappy Bird开发者推虐心新作Swing Copters 学习的革命:AR增强现实遇到儿童应用 颠覆旧概念,IBM Bluemix开启云开发时代 专访企业QQ SaaS团队,谈企业级LNMP架构设计 《近匠》Coding:将软件开发搬到云上 小米与美视频游戏服务Ouya合作 进军国内客厅 新工具Get!轻松实现2D画面动态光影的Sprite Lamp 一周消息树:罗升阳的Android之旅 手游不易:GungHo 3.44亿美元售Supercell股权 周末去哪儿 当然是去2014微信开发者大会!(附参会提醒和名单) 高分请贴:请问各位:客户端与服务器的较详资料! 有关BCB6里TXMLDocument的问题 请问这一个语句的判断条件怎么解释? 打架经验谈(转) 怎么样从一个节点的某个属性值把指针指向这个节点并修改它的另外一个属性? 怎么让RICHEDIT的滚动条在当前输入的这一行 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 看来新绑的Rave又不会是个什么好东东 急急急!如何像FlashGet一样,取出当前网页中的URL或某一条链接的URL?(400分赐教) Java 中 如何替换字符串 CSDN服务器的时间居然比北京时间快了7~8分钟! 奇怪!DBGrid数据显示不全!解决者再开一帖送100分! 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 请问有EHLIB的中文使用方法吗? 又是一个关于类定义的问题? 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 有谁知道phpmyadmin在哪可以下载?谢谢 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! “猫”总版主:是否把我的帐号解封? 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 快来救救我~~~~~~请大虾过来指教一下! 现在CSDN用了XML,我怎么保存好帖子呢? 这里谁用POP3收邮件的?? 寻软件高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 重启机器就进不了WIN98,这是怎么回事? 在C#里是用接口来解决多继承的问题的吗,给个例子好不好! 开个新帖专门讨论WEB打印问题吧 :) CBaseFilter类为题(急) 调查:你是Delphi程序员吗...... 到底ASP的内建组件?我在我机器上能用几个?我在我的机器上输入这么两条语句全都不能执行,请问为什么,我真惊了!谁能帮帮我? 超难度sql 语句 一个很菜的问题。 grub 不认ntfs?(在线等答,可行的话我给50分) 金童玉女的追求与堕落 请问如何让网格自动调整宽度? 放分之一(一个小小的题目,谁第一个写出来就得分) 装了XP后,如何找回Linux? 急需源代码…… 谁在??? 帮帮我啦。。~~~~~~~~~~ 急急急!! 请问MSDN里面所说的Video Capture函数和视频采集卡厂商所提供的SDK有什么不同了?在线等候。。 怎样使网页(IE)上选择的文字能够拖动到BCB程序中?(400分赐教,决不食言) 调查:你是共享软件作者吗........ 急需帮忙!!! 编程,怎能支持少数名组语言 到底在linux那里是用什么命令解压zip文档的?各位高手告诉我!! 已计算的子表单 DBGrid怎样实现0值不显示? 8月25日 0:23 论坛在线名单(462人)!好多人呀!不知道有在公司加班的吗? 在pb中 除了odbc和专有数据库连接 还有其他方式的连接方式吗 一个火字旁一个旦字读那样字? 电热暖手宝里面装的是什么液体 能用水替换吗? 拍苍蝇与小强的快捷键是什么 将红色的苋菜放入研钵中研磨一段时间,发现有红色汁液渗出.这是因为研磨操作破坏了咸菜细胞的液泡膜我知道.还有一样是细胞壁还是细胞膜还是叶绿体 不锈钢锅,用干布擦锅内时,有一点点黑色留在布上,请问这个锅还能用嘛?不锈钢都这样吗? 已知tanα,tanβ是关于x的 方程x^2-3x-3=0的两根,求tan(2α+2β) 把红苋菜放在热水中煮几分钟,沸水变红的主要原因是破坏了细胞的A.细胞壁B.细胞膜C.细胞质D.细胞核 如何巧擦不锈钢锅的油污 潍坊属于什么气候? 能用塑料杯泡茶吗?拜托各位大神 左边一个火,右边一个同,是什么字 明天潍坊天气怎样 CuSO4的溶液是什么颜色?固态晶体是什么颜色?如题可是为什么有的书上说CuSO4是白色固体呢? 需要什么原料,具体步骤是什么, 唯心主义的两种表现形式? 血液是溶液、悬浊液还是乳浊液? 电热暖手宝的双重温控开关是怎么连的啊 如何区别唯心主义的两种表现形式 人体营养物质的输送主要依赖于血液,血液属于 A悬浊液.B纯净物.C乳浊液.D溶液 电热暖手宝的问题!这种电热暖手宝(铁饼这样的,如图),是冲完电后自动断电,指示灯熄灭是凉的,然后自己慢慢升温吗?为什么我这个用了一个多月了,现在充电过程中,暖手宝都是热的,然后充 唯心主义产生的根源? 暖手宝(电热水袋)可不可以换水,如果可以,重新加水时又要加好多?生活中的常用问题 如何巧擦不锈钢锅的油污 唯物主义和唯心主义的实质是什么,对立根源是什么? 暖手宝里的水感觉少了怎么办啊? 饱和一元酸通式怎么求出来的 蟑螂能飞吗?日前,我在厨房发现两只蟑螂,一大一小,因蟑螂属于侵犯者,我决定消灭.我先踩死一只大的,于是刚抬脚,小个蟑螂高速飞起来跑到我的脚下,于是我顺势又踩死了.我认为小的是感到大 我的电热暖手宝坏了我的暖手宝是电热的 插在孔上灯就会亮昨天不知道怎么就坏了 里面有个硬的管子 要扯他才会亮 一放又熄了 真是郁闷 怎么回事哦 我该怎么办? 火 儿字读什么? 用水烫菠菜后菠菜为什么会有咸味 苋菜的汤变红了,其红色物质主要来自细胞的 A.细胞壁 B液泡 C细胞核 D细胞质 冬天人们使用电热暖手宝,那么在夏天人们用什么呢?不知道现在夏天可以用什么也可以凉快,类似于冬天暖手的电热暖手宝询问有这样的产品吗?携带时尚休闲又不乏单调,个性!也许插了电就很 用消毒液加水配制一种消毒液,药粉与水的比是1:200,现有药粉50克,需加水多少克才能配成这种消毒液.如果要配制这种消毒液804千克,需要准备水多少千克. 苋菜炒熟后为什么是红色的 大学生冬天进点什么卖,电热水袋,暖手宝可以吗? 为预防流感,按药粉和水的比是1∶40的标准配制消毒液,现有药粉20克,可以配制出多少克消毒液 苋菜中的红色是由什么色素引起的 若lgA+lgB=0(A≠1),则函数f(x)=A的x次方与函数g(x)=-B的x次方的图像关于——对称. 唯心主义认识论本质上是( )A 反映论 B 先验论 C 可知论 D 不可知论 若lga+lgb=0,z则函数f(x)=a^x与g(x)=b^x的图像关于?对称A.关于直线y=x对称 B.关于x轴对称C.关于y轴对称 D.关于原点对称 唯心主义运动观的根本错误就在于A.否认物质是运动的B.割裂了绝对运动和相对静止的关系C.否认静止是运动的特殊状态D.否认运动对于物质的依赖性 唯物主义和唯心主义的本质如果说唯物主义强调物质第一,意识第二,也就是物质存在于意识之外.之所以有意识,是因为有物质的存在,意识是对物质的一种反应.即使没有了意识,物质它还是存在 病字框下面一个坐字怎么读? 唯心主义运动观特点 唯物主义和唯心主义最本质的区别有哪些? 病字框中 上是自下是仑 读什么 唯心主义真的是错的吗高中课本要我们学唯物主义,但是我支持唯心主义啊人的存在就是一个矛盾,你到底在哪里。 哲学里说的唯物论和唯心论的本质区别是什么?RT,有知道的说一下, 病字框里面有个右耳刀是什么字?读什么? 论述辩证唯物主义的运动观,并指出唯心主义运动观和形而上学唯物主义运动观的主要错误. 二元论本质上是一种唯心主义(是否正确) 病字框的字有哪些 在物质和运动的关系问题上,形而上学和唯心主义的共同错误为A.设想没有运动的物质B.设想没有物质的运动C.仅把运动和某些具体物质形态联系起来D.把物质和运动完全割裂开来标准答案选D, 用两种方法计算行列式(0,2,4,6)(1,-1,0,1)(3,0,1,-1)(2,4,0,3) 饱和一元酯 饱和一元酸基本通式是什么? 用行列式性质计算 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 14个转行 记4行4列 在ABC中,D为AB中点,AB=4,AC=7,若AC上有一点E,且△ADE于原三角形相似,求AE的长 电热暖手宝和储水式暖手宝哪个好 请问这个行列式怎么计算,只用性质 1 2 3 4 1 0 1 2 3 -1 -1 0 1 2 0 -5 预防猪流感 甲型h1n1 用什么消毒液预防猪流感 甲型H1N1 用什么消毒液不用84 味道太大 给医院是的 闻了就想吐 家里还有很多宠物84有毒
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘