文档章节

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

青莲兮青兮
 青莲兮青兮
发布于 2017/09/03 13:27
字数 1006
阅读 7
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
32分钟前
1
0
Ubuntu集群-使用MAAS开始裸机安装

Ubuntu使用MAAS装机的七个步骤。 1、Setup your hardware You need one small server for MAAS and at least one server which can be managed with a BMC. It is recommended to have the M......

openthings
45分钟前
3
0
OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
4
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部