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

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

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

业界前三甲:App Store两个刷榜者,站了出来 极客无极限 一行HTML5代码引发的创意大爆炸 将服务器“弃”之荒野? 微软玩转露天数据中心 Dropbox:我们现在关注“内容” 而不仅仅是文件存储 访Teradata Aster Mayank Bawa:抛弃无效数据,让分析走向大众化 谷歌Chrome或新增通知中心 与Google Now整合 传言称HBO节目将登陆苹果Apple TV? Crashlytics被收购,应用崩溃报告服务要火了? 微软公布WP7.8完整功能 诺基亚率先升级 BlackBerry 10或许不仅仅是一剂强心针 一周消息树:专访蒋彪:JavaEE是企业级开发首选 移动周报:从封闭到开放,iOS生态系统要变天? 游戏平台上:Win7已跌破70% Ubuntu突破1% 不再那么传奇 扎克伯格时代或结束 微软应该联手Firefox OS,打造破坏性生态系统 中美IT人才俱乐部第一期:硅谷经验面面观 中国第四季度Android和iOS智能手机出货量高达98% 开发者眼中的代码审查“真相” 互联网产品设计的12个理念 Pair、Between、小恩爱:妹纸装个情侣应用吧? 横跨四大操作系统:3DMark将挑战所有智能设备 美国碰壁欧洲得意 华为获CERN青睐 应用数据分析新标准:Flurry增应用崩溃分析功能 Twitter被黑客入侵,25万用户信息可能被窃 16亿美元超级计算机项目助力解读人脑 卡巴斯基发现新型Android恶意软件 可入侵Windows 谷歌发布基于B-Tree的C++模板库 开源产品系列:高性能Web框架Zend Framework LiFi是否会取代WiFi? 1月浏览器排行:IE10突破1% Chrome连续3月下滑 Wine让Android也能运行Windows软件 高手请进!!分,不够再给!!是关于session的问题!! samsung550s显示器一问,在线等待…… RedHat 8.0 启动进不了XWindow视窗,怎么办呢???? 在C#中如何完成byte[]之间的拷贝,或者部分拷贝 请问Fuction(T("helpnet"),int i)中的T是和作用? 在客户服务器系统中如何向服务器中请求查询数据? 连接SQL——PLUS问题,用connect / as sysdba,抱错:服务句柄未初始化 关于安装程序的问题,来者有分 急,请高手赐教,在线 初学C++,我是不是需要详细的了解模板技术 游戏开始时的图形菜单和控件是怎么做的? 请诸位将已解决,但长期不结账的case贴在这里。 前几天搞了一个小东西 抱着试试看 在csdn上发布了 没想到今天一看 已经有十多个朋友捧场进行了下载 ######请问,不创建窗体,怎么读出窗体中的控件的属性? 答对给500分! 这个痛苦的程序已经到最后关头,请大家一定要帮我一把:) 100分求优秀MySQL技术网站。 位图菜单... 如何让自己的程序不在Window任务管理器里面出现? 关于DTS数据库导入的问题 网页设计 怎么出现了这么怪的问题?……大家进来看一下阿,来者有分!! 问大家一个语法问题;下面的句子是什么含义? 怎么样从文件里读出数据? 大家注意一下,看看里面的内容,如果有自己的ID,请尽快结贴,要不将被强制结贴! 在asp.net内怎样表示局域网络上的共享目录的路径??? 如何让测量结构可通过WEB方式查看, 急急急, 请各位WEB开发高手帮帮忙 再当一年程序员,然后去卖血。心情沮丧,散分。 怎样把jpg文件设置为墙纸? 查询出字段中最大值的记录????字段为(number)型!在线等候! 请问新改版的CSDN是用ASP.Net开发的吗???我有事要请教 有没有对格斗游戏原理精通的朋友吗? javascript如何定制子框架(iframe)的onkeyup事件,在线等,谢啦! 有人知道该怎样解决吗??(在线) 急告:怎样向打开的批处理文件的命令提示符界面中输入参数 无聊兄,海良兄请进 基础问题:怎样能将一个int型变量转变为float型? 高分请教 VB中访问SQL 2000的表格语句? 各位大哥,给点意见 win2000 advance sever与win xp!xp不能上网浏览网页 有WEB开发经验的请进 请问谁有ocr的相关资料? 偶这样的人为什么找工作难? 无赖来领伤。。。 如何使用JDBC直接将Blob对象保存到数据库 未处理的“System.FormatException”类型的异常出现在 mscorlib.dll 中 是怎么回事? vc与图像处理 有什么工具可以记录下本机的网络连接记录? 如何计算工作日? Sun ONE Studio谁用过?请教 Delphi5 代码转 C++ Builder5-6,请各位跨越这个界限的高手看看,谢谢! 谁知道孟子比孔子牛吗? 深圳市英语活动手册第9册21页答案 初一历史老子,孔子,和百家争鸣)问:你一定见过中国式过马路的场景吧,请你运用所了解的儒墨道法等思想对这一现象提出管理的方法 我的叔叔于勒中 于勒的生活经历 急 谁先回答 句型转换,把下列句子改为祈使句.You must go home now.You should put up your hands.You shouldn't run in the hallway.I want to watch TV.You can't swim in the river. I want to watch the news on TV.--------,please A.turn it B.turn it on 我的叔叔于勒 怎么简写? that is why i tell you what in you heart 翻译 一个月 每天使劲听六级的英语听力,12月份的四级英语听力能提升上去吗?有什么好方法吗?我说的使劲听是指每一段都听懂听会...我想说~还有一个月的时间,我是每天听四级真题好还是听比四 《我的叔叔于勒》换个口吻缩写小说.以于勒或菲利普夫人为第一人称 英语翻译【拒绝机译】Lafee Tell Me WhyI’m lying wide awake My head spinning over you Dark of night,no stars inside You are dreaming next to me Afraid to close my eyes,‘cause I don’t wanna miss a moment of you Don’t want to dream,no N 我们人类现在是不是还在进化啊!能不能在往更高层进化了?要是我们人类还在进化,那是我们人类进化的比以前更快、还是比以前慢啊?还有我们进化的有没有动物快啊?会不会被别的物种超越? Don't watch TV and do your homework.的同义句是什么___ ___ TV and do your homework. 谁知道现在中国it业年薪是多少,底薪呢? 我们人类还在继续进化吗我们人类会不会进化到更高等,现在我们人类的基因有没有停止进化 Tom,finish your homework first,or you _____watch TVAshan'tBmustn'tCneedn'tDmay not选A,为什么,请详细作答. IT业的年薪平均是多少?程序员之类的如果是专科生呢? 人类还在进化吗 孟子思想对孔子思想的继承和发展体现在哪些方面? 宗教的本质是人类社会发展到一定历史阶段,人类思维能力发展到一定水平而出现的社会现象,这句话对吗? 人类在历史上的生活正如旅行一样.旅途上的征人所经过的地方,有时是坦荡平原,有时是崎岖险路.老于旅途走到平坦的地方.愈能感到一种冒险的美趣.求赏析, 需Bruno Mars 的《marry you》的英文歌词!~谢~~ 印度的IT业怎么样?薪资呢? 在百家争鸣的时期,以孔子、孟子为代表的是——家,以老子、庄子为代表的是——家,以——为代表的法家,以——为代表的墨家,以公孙龙为代表的名家等 有谁帮我翻译一下“早上好,先生,今天天气很好,不是吗?”谢谢! 英语形容词+反义比如big-small,还要加上比较级...要10个已经写出的句子:I want to go to the foreign language bookshop.i have a small dictionart now and it doesn't have many words.i need a bigger dictionary .仿写上面句子... 春秋战国的孔子 孟子 老子 庄子 这些人我光记混有人能帮我总结一下吗主要是 他们的思想 事迹 名言 等等说的好的我 的 the amount of 和 the number of有什么区别?是可数不可数的问题么 孟子与《孟子》一文中,孟子继承孔子的哲学政治思想并有所发展的表现是什么?请分条陈述 luck的形容词 副词 反义形容词 effect 和affect ,number 和amount 的区别 i dont want to let you go Weezer歌词 历史上战争给人类历史和社会的发展带来哪些影响 英语翻译 反义词前缀有in,im,ir把原词和原词的反义词和他们的意思写上! (1)百家争鸣各家主张有什么不同?(百家争鸣中有道家老子,儒家孔子孟子,墨家墨子,法家韩非子)哪里有关于百家争鸣的视频? 傻瓜用英语怎么说在短腿的反击里秀晶说的傻瓜 lt's half past six. The baby is ____(wake).好的加分.为什么这么写 Tell'm that's not' u,coz I...miβ u 翻译 英语中,turning on the left和turn left有什么区别? 你很漂亮,这句话我想表示反问,该如何翻译呢? 对孔子的认识是什么? 沪江开心词场如何删除单词书 有哪些ir发/3:/的单词 关于孔子的了解 Turn on the light的中文是什么? ir发 e 有哪些单词 1.do you homework.变为否定句 2.please show you turn on the man.变为否定句1.do you homework.变为否定句 2.please show you turn on the man.变为否定句 3.why don't you turn on the bender?肯定回答4.stop laughing!写同义句5.you mu have to turn on the light的中文意思 写出含有ir组合的单词,并写出汉语. can句型怎么改成祈使句?下面有一道题目,请你们解答:问:You can make a molde plane.(can):改成can句型怎么改?上面的题目是错的。应该是:问:You can make a molde plane.(祈使句):改成祈使句怎 turn on the light switch. n开头,中间有ir的英文单词 百家争鸣中,有孔子、老子、韩非子.但这都不是他们的原名.那历史上有谁是叫( )子的原名?举例越多越好,不知道的别回答=-= what/which is your size? 对括号内的词语提问1\She is drving (a new car).2\They are having (a party) now.3\(The girl) is doing her homework now.4\He is (drawing party) now.5\The children can swim (nom).6\Class begins (at 8) every morning.7\My family live (in a big fla 句型转换 You can't swim in the lake.(改为否定祈使句) what c___ is your new shirt?---lt's blue. 英语活动手册 第九册 孔子与百家争鸣百家争鸣指什么家?代表人物是什么?怎么争鸣?史上对孔子的评价是什么
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘