程序员常常需要和bug打交道,一般来说调试bug的时间要多于编写程序的时间。

bug可以简单的分为两大类:

  1. 语法上的bug
  2. 逻辑上的bug

语法上的bug就是指编译器能够识别的,例如常见的缺少分号和括号,传参时数据类型不匹配,这一类的bug是比较容易调试的。可以直接根据输出信息找到对应的错误语句。

逻辑上的bug就很麻烦了,这样的bug编译器是不会显示出来的。例如最常见数组越界,非法访问内存这些问题编译器都不会去识别,只有程序在执行的时候才会显示出来。这个时候我们常常通过会将程序分块,来判断程序可以执行到哪一步。这个时候一般有两种常用的方法:

1、设置断点

现在的IDE都提供了这个功能,当程序运行到断点处就会直接停下来。

2、人为的加上输出语句

例如C语言可以用printf语句来判断程序可以执行到哪一步。

这两种方法各有优缺点,《麻省理工:计算机科学编程导论》的时候讲到调试时需要注意的事情。感觉挺好,特记录下来。(另,课程中提到,“print”和“重新阅读代码并思考”是很重要的方法。确实,有时候调试工具的单步调试会让你局限于细节,而没有从整体上去观察思考代码。不过 有时候调试工具也能给我们带来很大帮助。也许两者结合起来会让调试更加有效率吧)

下面是debug的一些经验总结:

    1. 自变量顺序错误。(注意参数命名,以避免颠倒顺序。实参和形参用相同的名字会调理清晰)
    2. 拼写错误。
    3. 忘记初始化。
    4. 对象与值相等。“==” 与" = "
    5. 别名。数组、链表的深度复制和浅复制。
    6. 副作用。函数执行过程可能会改变一些变量的值。
    7. 收集自己经常犯的错误,调试时先从易犯的错误下手。
    8. 记录你尝试过的修改,调试用的“print”可以注释掉而不是删除。
    9. 调试别人代码的时候,调试的是代码,而不是注释。不要被注释所迷惑。
    10. 寻求帮助。旁观者清,寻找别人帮助,尽可能向别人解释清楚自己的程序,也许你在解释的过程中就能发现错误了。
    11. 清醒一下大脑。
    12. 欲速则不达。考虑好修改方案,而不是急功近利。修改这个bug的过程可能会产生更多的bug。
    13. 代码不能总是变长。代码写的越多,出错误的可能就越大。当你遇到问题时,试着把你的代码整理一下,整理的过程中也许你就可能找到错误。
    14. 及时备份旧版本代码。确保你的代码能够回到Debug前。没有什么比你Debug 4个小时,最后发现还没有4个小时前好,更令人沮丧的是你不能回到最开始的状态。硬盘空间很廉价,多保存一下旧版本的代码绝对没有坏处。

参考博文:http://alorry.blog.163.com/blog/static/647257082011664510817/

debug的一点总结的更多相关文章

  1. 关于DEBUG的一点体会

    目录 1. 看待问题 2. 为什么要debug 3. 我理解的问题定位能力 4. debug能力模型的4个层级 5. 小结与扩展 1. 看待问题 遇到更高级的bug,解决更重要的问题,是开发同学的迭代 ...

  2. debug的粗略使用(求大神们补充、指教,小渣马上改)

    debug的使用 往往我们在写代码的时候会发现那种很隐秘的bug,一直找找不多,甚至开始怀疑人生.目光扫描和人脑编译又耗时又耗精力又很容易中途乱了脑子,一切得重新来,所以我写了一篇博客来模拟一下检查b ...

  3. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  4. Maven插件mybatis-generator,如何让生成的PO类的field上有对应表字段的注释

    前言 去年刚入职的时候,我就发现,po类(和数据库表对应的类)上,一片都是光秃秃的,什么注释都没有,类上没注释,field上也没注释. 在以前的项目中,其实我们都是有生成注释的,比如,对于下面这个表: ...

  5. jmeter sampler maven项目排错记

    eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...

  6. 一点总结-关于debug比赛

    上午的题目是: 1. main里面定义的变量必须手动初始化,使用memset或者其他,函数外或者函数内,会进行初始化为0. 2. 最长回文子串的马拉车manacher算法,不会写! 3. 数字三角形d ...

  7. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  8. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  9. 重新编译jdk源码,启用debug信息

    我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工 ...

随机推荐

  1. JDBC-批处理操作

    javaweb学习总结(三十六)——使用JDBC进行批处理 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效 ...

  2. css 超详细文档

    http://www.runoob.com/css/css-boxmodel.html

  3. JAVA中如何用接口实现多继承和多态 (非常好)

    ---------------------------------------------------------------多态1.JAVA里没有多继承,一个类之能有一个父类.而继承的表现就是多态. ...

  4. 关于Unity中的道具拾取(专题六)

    原理就是把道具做成触发器,触发器就是当我们有碰撞发生的时候,只会检测碰撞,而不会有任何改变物理运动状态的过程. 触发器非常适合道具拾取,因为它不会改变原本运动物体的任何物理属性,但是依然会检测碰撞,响 ...

  5. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  6. e801. 创建一个JProgressBar组件

    A progress bar is used to visually indicate how much a task has been progressed. A progress bar can ...

  7. Activiti5.16.4部署小记

    版本说明 OS:Win7 JDK:jdk1.6.0_45 Tomcat:apache-tomcat-7.0.62(解压缩版) 部署过程 1.安装JDK,配置环境变量,so easy,具体过程就不写了, ...

  8. Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)

    //该错误无法识别,是因为你使用了旧版本的proguard,建议你下载新版本4.5以上的proguard来替代Android SDK中使用的旧版sdcard 这样你就可以知道错误所在.因为只有4.5版 ...

  9. php 变量定义方法

    1.定义常量define("CONSTANT", "Hello world."); 常量只能包含标量数据(boolean,integer,float 和 str ...

  10. Git 基础 - 远程仓库的使用

    远程仓库的使用 要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写.同他人协作开发某个项目时,需要管 ...