文档章节

程序员新人怎样在复杂代码中找 bug?

青莲兮青兮
 青莲兮青兮
发布于 2017/09/03 13:27
字数 1006
阅读 6
收藏 0
点赞 3
评论 0

我曾经做了两年大型软件的维护工作,那个项目有10多年了,大约3000万行以上的代码,参与过开发的有数千人,代码checkout出来有大约5个GB,而且bug特别多,open的有上千,即使最高优先级的showstopper也有上百。

分享下我的debug的经验

1.优先解决那些可重现的,可重现的bug特别好找,反复调试测试就好了,先把好解决的干掉,这样最节约时间。

2.对于某些bug没有头绪或者现象古怪不知道从哪里下手,找有经验的同事问一下思路,因为在那种开发多年的大型系统里,经常会反复出现同样原因的bug,原因都类似,改了一处,过一阵子另外一处又冒出来,而且无法根治。

比如:我那个系统里有个特别危险的API,接口参数比较难用,一旦有人用错了某些情况下就会出诡异的现象,解决很简单,找到调用这个API的地方把调用方式写对就好了。为什么不根治呢?因为要保持兼容性不能改接口了。Windows系统里就好多这种烂API。

问下老员工吧,说不定他们都遇到过好多次了。

3.放大现象,有些bug现象不太明显,那么就想办法增大它的破坏性,把现象放大。这只是个思路,具体怎么放大只能根据具体的代码来定。

比如:美剧《豪斯医生》里有一集,怀疑病人心肺有问题,就让病人去跑步机上跑步,加重心肺负担,从而放大症状。

4.二分法定位,把程序逻辑一点点注释掉,看看还会不会出问题,类似二分查找的方法,逐步缩小问题范围。

5.模拟现场,有时候我会问自己,如果我要实现bug描述的现象我要怎么写代码才行?

比如:我遇到一个死锁问题,但是检查代码发现所有的锁都是配对的,没有忘记解锁的地方,而且锁很简单就是一个普通的临界段,保护几行赋值语句而已。这样的代码怎么写才能让他死锁呢?

我想如果让我故意制造这样一个现象,只有在上锁的时候强制杀掉线程了。

既然这样就可以去看看有谁强杀线程了没有。

6.制作工具,针对某些bug编写一些调试辅助工具。

比如,我那个系统没有完善的崩溃报告,虽然也有dump,但是分析出来的callstack经常不准。于是我为解决崩溃问题编写了个工具,会自动扫描代码,在每个函数入口和出口插入log,以此来定位崩溃点。

7.掩盖问题,虽然这样做有点不厚道,但是有时不得不这么做。有些bug找不到真正的root cause,但是又要在规定时间内解决,那么我们就可以治疗症状而不去找病因。比如用try catch掩盖一些奇怪的崩溃。不到万不得已不要这么干,未来可能会付出更大代价。

我在做这份工作的时候也在追美剧《豪斯医生》,豪斯大叔解决病症的思路和debug差不多,对我很有启发。如果你也想在IT行业拿高薪,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来我们的JAVA交流群:240448376,群里网盘也有各种免费资源共享,不懂的知识点可以问群主管理员。期待你的加入。

作者:姚冬

来源:知乎

本文转载自:http://www.jianshu.com/p/b1fa2c736349

共有 人打赏支持
青莲兮青兮
粉丝 2
博文 8
码字总数 0
作品 0
成都
面向对象的理解(一):面向对象的前身功能分解

一、面向对象泛型之前:功能分解 功能分解是一种处理复杂问题的自然方法。 举个简单的例子:编写一段代码实现去图书馆借书的功能。 1.在电脑上检索你需要的图书籍。 2.到图书馆找见你需要借的...

武小猪
06/26
0
0
1年工作经验和10年工作经验的程序员的差别

专栏 | 九章算法 网址 | http://www.jiuzhang.com 刚刚工作1 年“初生牛犊不怕虎”的程序员新人和工作了大概10年的程序员“老人”之间有着许多差别。这些差别不分对错,不分好坏,各有各的特...

01/18
0
0
如何在2018年变成一个牛B的程序员?

热文导读 | 点击标题阅读 给程序员的10条建议,吐血推荐! 吊炸天!74款APP完整源码! 2018年快来了,BAT等一二线互联网公司Android面试题汇总 最近同一部门另一个项目组的一位程序员被“主动...

xj032w2j4ccjhow8s8
2017/12/31
0
0
阿里内部揭秘:年薪百万程序员的十大成功要素

  1、扎实的基础   计算机领域是一个快速更新换代的领域,每隔一段时间都会有新的语言、框架、思想产生,追随每一个新技术很累。但仔细想想,事实上并没有那么多新东西。很多新东西只不过...

学习web前端
2017/12/20
0
0
怎样尊重一个程序员

文章出处:yinwang.org 得知一位久违的同学来到了旧金山湾区,然而我见到他时,这人正处于一生中最痛苦的时期。他告诉我,自己任职的公司在他加入之前和之后,判若两人。录取的时候公司对他说...

oschina
2015/05/18
15.8K
87
女网友吐槽:程序员男友约会也要解bug,我重要还是bug重要?

程序员给人的印象就是很忙,加班加点的忙,那作为程序员的女朋友,又是怎样一种体验呢?有一名女网友就在网络上吐槽起来,称自己的男朋友是个程序员,本来约好了见面,按时到了十五分钟后,男...

智能硬件前沿
04/24
0
0
如何成为架构师?7 个关键的思考、习惯和经验

工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,...

t4i2b10X4c22nF6A
2017/12/12
0
0
如何成为架构师?7个关键的思考、习惯和经验

工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,...

陶邦仁
2016/03/15
31
0
Code Review 程序员的寄望与哀伤

一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug。 事后分析,是生产环境的一些微妙差异,使得这种 bu...

oschina
2016/07/04
4.9K
12
[每天一个知识点]16-软件工程-什么叫完成

90-90法则是贝尔实验室的Tom Cargill所提出的,内容是:开发软件时前90%的代码要花费90%的开发时间,剩余的10%的代码要再花费90%的开发时间。这倒是应了中国一句古话,西汉的刘向说的,行百里...

Maxwell1987
2015/01/28
0
6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
13分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
21分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
32分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
33分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
36分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
39分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
45分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
51分钟前
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0
mybatis-session.selectList源码分析

0.构建工厂:SqlSessionFactory 。 new SqlSessionFactoryBuilder.build(配置的xml文件) 获取sqlSession对象 //指定事务隔离级别 1. sqlMapper.openSession(TransactionIsolationLevel.SER......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部