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

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

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

盘点最受开发者喜爱的Android 5.0 Lollipop API IoE Day侧记:想开发智能硬件?先要弄明白这几个问题 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(二) 微软承诺所有Lumia WP8设备将升级至Win10,用户会买账吗? 周末,深圳微信开发者大会等您来!(参会必读+名单) 营造云安全生态链 第五届云安全联盟高峰论坛在京顺利召开 中国大数据六大技术变迁记 【最具价值CTO评选秀】当当网CTO熊长青:结合行业及技术发展,规划技术方向 社交颠覆传统,环信技术交流沙龙纪实(组图) 揭秘经典案例炼成之道 微信开发者大会精华回顾 从一家电子商务网站学到的经验教训 【最具价值CTO评选秀】极路由CTO康晓宁:极客转型CTO的感悟 盘点这些年来的“微信万能论” 《近匠》亲加通讯云:IM即时通讯API的极致服务者 TCL杯HTML5智能电视开发大赛完美落幕,8项获奖应用大揭晓! Xcode 6.2 Beta发布,支持WatchKit的iOS 8.2 SDK来了! 【最具价值CTO评选秀】携程高级技术副总裁叶亚明:从呼叫中心到移动互联网的演进 为什么靠谱的公司都应该参加CTO评选? 【深度剖析】微软开源.NET:战略重心已从PC转移到云端 专访POWER 8编程挑战赛选手黄文超:非科生的编程算法之路 BDTC 2014干货精彩不断,四大全天技术论坛议题全面曝光 全功能API!开源2D游戏引擎Firmament 微信公众平台新增“微信连Wi-Fi”功能,打通线上线下闭环 马化腾:微信在一线城市活跃 QQ增长从城市到农村 承包MIPS开发!Imagination发布双Codescape MIPS SDK 不任性了!Google Play宣布开通国内开发者通道 脑洞大开!用Swift写个Material Design组件库 美国最大婚恋网站eHarmony利用Hadoop、OpenStack重构自己 每个Java开发者都应该知道的5个JDK工具 异构计算应用研讨暨OpenCL编程培训在上海和西安成功举行! APIs.io:用来发布和发现API的利器 Help的窗口 送分:关于数据库中的数据在前台显示的问题,敬请高手指教 请问一下各位PB FANS,PB中的自定义事件中的extenal选项有何作用? Label的小问题,以后给分,现在确实没分了。 测试a 有沒辦法使成員函數只供指定的 class 呼叫! 请问如何给listview添加鼠标拖拽功能,如从本视图中拖走一行? Jbuild and Visual Age for Java 只使用数据库表单如何不带环境? 为什么在Cmd.exe 下可以运行,但是在ASP里面却没有办法写进数据???斑竹怎么只提供4页的讨论内容呢?? 救急,启动winNT时候inetinfo.exe总是共享冲突,该咋解决? 如何防止内存泄漏 帮忙看诊断一下遇到的问题。 Fatal error C1010: unexpected end of file while looking for precompiled header directive是什么意思?怎么改正? 关于数据窗口 D3D8的疑問 作动态连接库链接时出错? rLabel的小问题,以后给分. WebSphere 4.0中是否已经直接实现了connection pool CSDN的bug报告:您不能给自己加分...... ORACLE里的中文字符集怎么解决?高分求救!!! 身为一个程序员,谈谈这些年里你所拥有的成功经历!见识一下CSDN牛人总汇! 这是怎么回事呀? asp怎么调用存储过程,主要是参数问题怎么传递 高分,给高分!!! 如何在useradd,增加一个用户的同时,限定这个用户的使用空间 关于内存分配的问题 由金山英文写作助理想到一种木马机制 如何修改Delta数据包中的信息 请问各位哥哥,配置个wu-ftp服务器,一个大目录有一个用户访问,里面的小目录由其它用户访问,怎么配置? 文凭真的这么重要么! 提问关于并发服务器。 关于jbuilder5开发EJB运行容器时的问题,跟帖都有分 请问怎样加一个位图作为Dialog的背景? 写dll链接时出错? 有谁知道windows屏幕保护的通用密码? 请教光标定位 如何使用PFXImportCertStore函数将.pfx文件注册到系统中啊! 有谁知道windows屏幕保护的通用密码 有关JSP运行的问题。分数多多 一个非常菜的问题! 如何利用socket截获80端口的数据? ji.ji.ji... 如何防止内存泄漏001 有谁知道windows屏幕保护的通用密码, xiaoxi777(小溪):请教你刚才的问题 有谁知道windows屏幕保护的通用密码,帮帮忙 在Unicode转换中,_T()与L到底怎么用,有什么区别? 关于利用QQ广告入侵 有没有深圳的阿,我快失业了,哪里要PB程序员啊 有谁知道windows系统的屏幕保护的通用密码 无水乙醇加压容易爆炸? 为什么火药会爆炸 银离子,3价铁离子,和铜离子的氧化性强弱,怎么判断 碳的相对原子质量是?核电荷数少于核外电子数的一定是?A分子 B原子 C阳离子碳的相对原子质量是?核电荷数少于核外电子数的一定是?A分子 B原子 C阳离子 D阴离子 如何判断碳正离子稳定性? 铁离子,银离子,铜离子的抗菌性 请问有碳离子吗?为什么10电子微粒中没有碳离子呢? 苯环的结构? 银离子可以将铁或亚铁离子氧化成铁离子吗?为什么? 碳简单的离子电子式怎么写? 苯环的结构是怎样的 深水炸弹在深海处爆炸的原因是什么 焦炉出来的煤气含硫和萘,如果不脱硫脱萘会有什么影响会造成什么不好的效果呢? 苯环 是什么? 深水炸弹为什么只有下沉到特定的深度时才爆炸? 焦炉煤气脱硫,脱硫塔阻力大是什么原因?具体有几方面 苯环结构式中的氢个数怎么算 什么叫深水炸弹啊? (大学化学)碳正离子的稳定性我知道 3R>2R>1R 第五个有共轭更稳定 但第一个放哪? 炮弹为什么不在发射时爆炸? 深水炸弹在水中为什么到一定程度后会自动爆炸? 大学化学问题,希望给出正确答案. 如何判断碳正离子稳定性大小(+)CH3CH3(+)CH2CH3(+)CHCH3肿么判断.. 苯是不是有机物? 大学化学问题,学希望给出正确答案. 苯和苯环的区别苯和苯环是一个意思吗?如果不是,那它们之间的区别又是什么?还有,环的概念又是什么?谢谢! 三价铁离子能与哪些金属反应 焦炉煤气中含有哪些有毒物质 苯的取代基与苯环是怎么相互影响的?一个苯环分别连接一个甲基, 羟基,羧基,醛基,硝基,氯原子,氨基,那么怎么分析原子间的作用,从电荷角度? 这个知识点我需要完全明白才行. 谁帮我讲一讲? 三价铁离子氧化性比银离子强吗 如果把人放在真空中会不会爆炸呢?我们在大气压下体内压力和大气压是平衡的,一旦真空了外界没有与体内压力平衡了会不会爆炸呢?那么这也问题在宇宙飞船和潜艇里是怎么解决的? 苯环是不是就是指苯啊? 有机物苯1.甲苯溶于苯么2.溴苯溶于苯么3.苯酚溶于苯么 核武器能否在真空中爆炸 炸药爆炸的一个什么性质或变化? 苯是有机物吗 把鸡蛋放在真空里会不会爆炸啊我猜想鸡蛋在真空里会因为内部压力而发生爆炸,不过蛋壳有没有能力把鸡蛋压住啊? 炸药爆炸是将什么能转化为什么能? 二战时期,深水炸弹有效炸伤潜水艇的爆炸距离是几米? 真空中炸弹爆炸,只要不被弹片击中就不会受伤是吗?真空中的炸弹爆炸,由于没有空气,应该不会有冲击波,然后即使你离得很近,只要不被弹片击中,你就会安然无恙, 在有铁离子,亚铁离子,铜离子的溶液中加入硝酸银什么现象! 壁挂炉水压高会爆炸吗前两天听说水压最好不要超过0-1.5,可是我现在刚烧了两个多小时,水压就到了2.5,好害怕啊,我以前没烧过壁挂炉,你们说我继续烧,会爆炸吗,这是新家,不烧又很冷,你们只 大学有机题,如图.判断碳正离子稳定性. 什么是苯环 苯环相关性质 即其写法 壁挂炉会爆炸吗,水压高我以前没烧过壁挂炉,今天刚开始烧,前两天听人说,壁挂炉的水压最好控制在0-1.5,可是我现在刚烧两个多小时,水压到了2.5了,不烧又很冷,我该不该继续烧呢?》 为什么没有负四价碳离子RT 碳正离子的稳定性怎么判断啊 三价铁离子、三价铝离子和三价铬离子怎么分离分别获得 碳有没有正四价离子?是离子,不是正四价 如何给有机物中含苯环结构和环状结构的物质系统命名 最好举一些例子.例如苯佐卡因 一般水性涂料中会含有甲醛类物质吗? 碳和硅是否有四价的离子? 好多题目里给了含有苯环的物质的分子式,然后给出一些条件,要求写出其结构简式,但是该怎么写啊?苯环是C6H6,为什么C7H5OCl的结构简式是这样的啊?(要求含有醛基)C6H6+C7H5OCl与结构简式的原 苯类物质是什么啊~ 请问碳四价原则是什么?. 在什么情况下结构中有苯环怎样确定一个分子中是否有苯环呢? 有苯丙烯这个物质么弱弱问下 碳四价的含义高中有机化学写同分异构体的时候要满足碳四键 怎么着就是四键了?双键算几个 CH2-CH3这样算什么 带有苯环的物质有没有无毒的 在水性涂料中,哪种材料有净味功能,比如能去除醛和苯乖等等
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn