文档章节

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

青莲兮青兮
 青莲兮青兮
发布于 2017/09/03 13:27
字数 1006
阅读 10
收藏 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,群里网盘也有各种免费资源共享,不懂的知识点可以问群主管理员。期待你的加入。

作者:姚冬

来源:知乎

青莲兮青兮
粉丝 2
博文 8
码字总数 0
作品 0
成都
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.1K
18
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
7
TDD的测试框架--Machine.Specification

Machine.Specification 是一个 TDD 测试驱动开发的测试框架,简化了测试,无需关心语言本身特性。 Machine.Specifications 带来的好处是不需要在代码里有注释,但同时阅读代码的人可以一目了...

匿名
2013/01/22
1.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

android 获取mac地址

android获取Mac地址的两种方式,适用于6.0版本以下 public static String tryGetWifiMac(Context context) { WifiManager wm = (WifiManager) context.getApplicationContext().getSyst......

osc_8cqhsn24
17分钟前
0
0
阿里HR: 你会 Android 实现侧滑菜单-design吗? CN看了,原来这么简单呀!

google提供的Design开发包里,有很多实用好看的新控件,这里介绍下使用DrawerLayout+NavigationView实现侧滑菜单效果 要使用Design包,只要在项目的build.gradle中添加下依赖就好(记得更新S...

osc_evac23lh
19分钟前
0
0
IOS开发控件视图day15:UIPageControl设置定时器自动翻页,以及更改小圆点背景图片

.h文件 @property(nonatomic,strong)UIScrollView *scrollView0;@property (strong, nonatomic) UIPageControl *pageControl0;@property (nonatomic,strong) NSTimer *nstime; .m文件(具......

osc_494omtst
19分钟前
0
0
Codeforces Round #663 (Div. 2) (CD)

C. Cyclic Permutations 思路:全排列减去单峰排列即为答案。 单峰排列即:峰左边下标的左边没有比它大的,峰右边的下标的右边没有比它大的。 单峰排列个数: 2 n − 1 2^{n-1} 2n−1,除 n ...

osc_gh0ost1g
21分钟前
0
0
Python Pandas面试题及答案

Pandas是一个开源库,可在Python中提供高性能的数据处理。 Pandas这个名称源自“面板数据”一词,这表示来自多维数据的计量经济学。 它可用于Python中的数据分析,并由Wes McKinney在2008年开...

程序员面试吧
21分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部