debug的一点总结
程序员常常需要和bug打交道,一般来说调试bug的时间要多于编写程序的时间。
bug可以简单的分为两大类:
- 语法上的bug
- 逻辑上的bug
语法上的bug就是指编译器能够识别的,例如常见的缺少分号和括号,传参时数据类型不匹配,这一类的bug是比较容易调试的。可以直接根据输出信息找到对应的错误语句。
逻辑上的bug就很麻烦了,这样的bug编译器是不会显示出来的。例如最常见数组越界,非法访问内存这些问题编译器都不会去识别,只有程序在执行的时候才会显示出来。这个时候我们常常通过会将程序分块,来判断程序可以执行到哪一步。这个时候一般有两种常用的方法:
1、设置断点
现在的IDE都提供了这个功能,当程序运行到断点处就会直接停下来。
2、人为的加上输出语句
例如C语言可以用printf语句来判断程序可以执行到哪一步。
这两种方法各有优缺点,《麻省理工:计算机科学编程导论》的时候讲到调试时需要注意的事情。感觉挺好,特记录下来。(另,课程中提到,“print”和“重新阅读代码并思考”是很重要的方法。确实,有时候调试工具的单步调试会让你局限于细节,而没有从整体上去观察思考代码。不过 有时候调试工具也能给我们带来很大帮助。也许两者结合起来会让调试更加有效率吧)
下面是debug的一些经验总结:
- 自变量顺序错误。(注意参数命名,以避免颠倒顺序。实参和形参用相同的名字会调理清晰)
- 拼写错误。
- 忘记初始化。
- 对象与值相等。“==” 与" = "
- 别名。数组、链表的深度复制和浅复制。
- 副作用。函数执行过程可能会改变一些变量的值。
- 收集自己经常犯的错误,调试时先从易犯的错误下手。
- 记录你尝试过的修改,调试用的“print”可以注释掉而不是删除。
- 调试别人代码的时候,调试的是代码,而不是注释。不要被注释所迷惑。
- 寻求帮助。旁观者清,寻找别人帮助,尽可能向别人解释清楚自己的程序,也许你在解释的过程中就能发现错误了。
- 清醒一下大脑。
- 欲速则不达。考虑好修改方案,而不是急功近利。修改这个bug的过程可能会产生更多的bug。
- 代码不能总是变长。代码写的越多,出错误的可能就越大。当你遇到问题时,试着把你的代码整理一下,整理的过程中也许你就可能找到错误。
- 及时备份旧版本代码。确保你的代码能够回到Debug前。没有什么比你Debug 4个小时,最后发现还没有4个小时前好,更令人沮丧的是你不能回到最开始的状态。硬盘空间很廉价,多保存一下旧版本的代码绝对没有坏处。
参考博文:http://alorry.blog.163.com/blog/static/647257082011664510817/
debug的一点总结的更多相关文章
- 关于DEBUG的一点体会
目录 1. 看待问题 2. 为什么要debug 3. 我理解的问题定位能力 4. debug能力模型的4个层级 5. 小结与扩展 1. 看待问题 遇到更高级的bug,解决更重要的问题,是开发同学的迭代 ...
- debug的粗略使用(求大神们补充、指教,小渣马上改)
debug的使用 往往我们在写代码的时候会发现那种很隐秘的bug,一直找找不多,甚至开始怀疑人生.目光扫描和人脑编译又耗时又耗精力又很容易中途乱了脑子,一切得重新来,所以我写了一篇博客来模拟一下检查b ...
- C++和QML混合的QT程序调试方法
以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...
- Maven插件mybatis-generator,如何让生成的PO类的field上有对应表字段的注释
前言 去年刚入职的时候,我就发现,po类(和数据库表对应的类)上,一片都是光秃秃的,什么注释都没有,类上没注释,field上也没注释. 在以前的项目中,其实我们都是有生成注释的,比如,对于下面这个表: ...
- jmeter sampler maven项目排错记
eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...
- 一点总结-关于debug比赛
上午的题目是: 1. main里面定义的变量必须手动初始化,使用memset或者其他,函数外或者函数内,会进行初始化为0. 2. 最长回文子串的马拉车manacher算法,不会写! 3. 数字三角形d ...
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- 重新编译jdk源码,启用debug信息
我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工 ...
随机推荐
- 读取 classes下的配置文件
调用: Configure.getValue("discount.strategy.class"); 配置类: package com.util; import com.sun.j ...
- Chrome 主页被篡改
尝试恢复设置.重装chrome.改注册表均无果.最后意外发现解决方法无比简单:删掉桌面上的chrome图标,打开安装文件夹找到chrome.exe,随便改成什么名字.exe,比如baiduwcnm,重 ...
- gclient多源码管理工具 DEPS文件
gclient来管理源码的checkout, update等. gclient是google专门为这种多源项目编写的脚本,它可以将多个源码管理系统中的代码放在一起管理.甚至包括将Git和svn代码放在 ...
- underscore-1.8.3-analysis.js
// Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud an ...
- Jquery函数大全 - 案例说明
function(){$(this).addClass(”out”);}); toggle( fn, fn ) 如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二 ...
- Sword redis补充
Redis 键(key) Redis 键命令用于管理 redis 的键. redis任何数据类型都有key --删除key的命令 redis> del key Redis 事务 Redis 事务 ...
- 用python读取stata文件及写入and注意事项
读取: 由于stata没有专门模块,是从pandas里面调用,官方文档少之又少,故去查看源代码 #!/usr/bin/env python# -*- coding:utf-8 -*- from pan ...
- Wireshark 捕获过滤器的语法
转自:http://blog.csdn.net/qq_29277155/article/details/52077239 前言 我们都知道,wireshark可以实现本地抓包,同时Wireshark也 ...
- linux中CURL的安装(转)
转自(http://blog.csdn.net/makenothing/article/details/39250491) curl是一款著名的字符界面下的下载工具,支持HTTP.HTTPS.FTP. ...
- Ubuntu -- 安装、卸载程序的命令
通过sudo apt-get install xxxx 安装软件后,总是无法卸载干净,这里以Apache 为例,提供方法:首先sudo apt-get remove apache2再sudo apt- ...