程序设计实现笔记——排错

原创 2013年12月05日 20:47:26

  • 好的程序员知道他们在排错上花费的时间至少与写程序一样多,所以他们努力从自己的错误中学习。
  • 对减少排错时间能有所帮助的技术包括:好的设计、好的风格、边界条件测试、代码中的断言和合理性检查、防御性程序设计、设计良好的界面、限制全局数据结构以及检查工具等。早期预防胜过事后治疗。
  • 初学者都有一个倾向,那就是抱怨编译系统、或者程序库、或者除了他们的代码之外的 其他任何东西。有经验的程序员当然也希望能这样做,但是他们知道,实际上多半是他们自己的错。
  • 排错涉及到一种逆向推理,就像侦破一个杀人谜案。
  • 寻找熟悉的模式,典型错误。忘记对局部变量进行初始化是另一类容易识别的错误
  • 检查最近的改动。如果在新版本里出现错误而旧版本原来没有,新代码一定是问题的一部分。
  • 不要两次犯同样的错误。当你改正了一个错误后,应该问问自己是否在程序里其他地方也犯过同样错误。一旦你确定并更正了一个错误,就应该再想一想,你是否也清除了其他类似的错误。
  • 有时你看到的代码实际上是你自己的意愿,而不是你实际写出的东西。离开它一小段时间能够松弛你的误解,帮助代码显出其本来面目。
  • 把你的代码解释给别人。
  • 把错误弄成可以重现的。第一步应该是设法保证你能够使错误按自己的要求重现。你应该花点时间,设法构造输入或者参数设置,
    使自己能可靠地再现问题。例如输出随机数生成器的种子值,以保证你能产生同样的输出。
  • 分而治之,问题局部化。能否把导致程序失败的输入弄得更小一点,或者更集中一点?采用二分检索的方式,丢掉一半输入,看看输出是否还是错的。如果不是,回到前面状态,丢掉输入的另一半。
  • 研究错误的计数特性。有时失败的实例具有计数特征方面的模式
  • 显示输出,使搜索局部化。如果你不能理解程序到底在做什么,弄清楚它最简单的而又代价低廉的方法就是加一些语句,使程序显示出更多的信息。用这种语句验证你对程序的理解或者你对什么东西可能出问题的想法
  • 写一些简单的程序去测试你的假定,或者确认你对某些东西工作方式的理解。
  • 源代码控制程序,如 R C S,能够跟踪代码的版本,使人可以看清哪些东西被修改过,还可以恢复原来版本,回到已知的状态。
  • 保留记录。如果查找某个错误的过程花了一定时间,你可能就要开始忘记试验过的情况和已经学到的东西了。
  • 例如花了大量时间在没有错误的地方寻找,由于测试程序本身有错,被测试的根本不是程序的正确版本,或者是忘记了在测试之前更新或者重新编译,等等。
  • 存储器“流失”—不再使用的存储没有退还—是程序古怪行为的一个重要根源。另一个类似问题是忘记关闭文件,直到打开的文件占满了文件表,程序无法再打开新文件。带有这类漏洞的程序最终将奇怪地垮台,原因是它用光了所有资源,而特定的失败又是无法重现的。
  • 不能始终重现的错误是最难对付的,应该先检查所有的变量是否都正确地进行了初始化。
  • 如果在增加排错代码之后错误的行为改变了,甚至是消失了,那么它很可能就是一个存储分配错误,有许多输出函数,从 p r i n t f到对话窗口,在工作过程中都要分配存储,这些都能进一步把水搅混。



《JavaScript高级程序设计 第三版》学习笔记 (十一)事件详解

一、事件流 1.事件冒泡:事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。最早使用事件冒泡的是IE,现在绝大多数浏览器都使用冒泡。IE9、F...
  • lbxx1984
  • lbxx1984
  • 2014年09月01日 21:55
  • 1373

编程珠玑(第二版)读书笔记第一章

前言:           这本书也是看了别人的
  • dapengbusi
  • dapengbusi
  • 2014年05月08日 00:15
  • 1055

《Redis设计与实现》读书笔记

花了几天时间把《Redis设计与实现》读完了,把一些心得记下来给大家分享。     第2章 简单动态字符串     redis里面的字符串对象都采用SDS结构实现。SDS有别于C风格的字符数组和jav...
  • bruce128
  • bruce128
  • 2015年08月08日 22:56
  • 1220

程序设计实现笔记——性能

优化的第一要义是不做。 如果你已经选择了正确的算法,那么只有到了写程序的最后,才有可能要关心执行的优化问题。如果你必须做这件事情,进行工作的基本循环应该是:测量,把注意力集中到若干个做一点修改就能...
  • coolwaterld
  • coolwaterld
  • 2013年12月10日 18:48
  • 530

程序设计入门——C语言笔记(第0周-第3周)

程序设计入门——C语言笔记第0周:概述本科时期学过一些C++,现在自学数据结构算法的时候感觉需要重新补一下C语言。 所用IDE: Dev-C++ 5.11#include int main() { ...
  • sunsun929292
  • sunsun929292
  • 2016年07月28日 02:09
  • 114

读书笔记(二)——《Java核心技术卷一》第三章Java的基本程序设计结构

1.数值类型之间的转换 图中显示的是数值类型之间的合法转换,虚线箭头表示转换的时候可能有精度损失,将两个不是相同类型的数值进行二元操作时,先要将两个操作数转换为同一种类型,然后再进行计算,转换有...
  • luqiren
  • luqiren
  • 2017年08月06日 11:25
  • 140

《Lua程序设计》笔记之三——标准库

18. 数学库        数学库由算术函数的标准集合组成:三角函数(sin,cos,tan,asin,acos,etc),幂指函数(exp,log, log10),舍入函数(floor,ceil...
  • xiao_0429
  • xiao_0429
  • 2014年01月01日 15:03
  • 2519

《JavaScript高级程序设计》笔记——chapter5 引用类型(Object/Array)

前言 前面在第三章基本概念一节稍微提及了引用类型的概念,在第四章详细介绍了基本数据类型与引用类型作为变量时的不同。本章将详细介绍ECMAScript的原生引用类型。 首先复习下基本类型值与引用类型...
  • thumd_lee
  • thumd_lee
  • 2016年12月08日 20:11
  • 207

MFC Windows应用程序设计——学习笔记【1】

Windows API函数根据功能大体可以分为以下三大类型
  • dongbeidami1992
  • dongbeidami1992
  • 2014年09月02日 22:33
  • 241

《javascript高级程序设计》读书笔记——引用类型之function类型(细节整理)

Javascript 中每个函数都是对象,是Function
  • lxfhaha
  • lxfhaha
  • 2014年09月21日 18:14
  • 329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序设计实现笔记——排错
举报原因:
原因补充:

(最多只允许输入30个字)