bug原意是虫子,但是为啥把程序问题叫做bug?叫做虫子?
1947年9月9日,马克二号停止了运转,经过检查发现有一只飞蛾卡在继电器里面,由此导致了程序停止运行,这个是史上第一个bug
DeBug是每个程序员必备技能
一解决问题的流程:
- 了解问题->定位问题->分析问题->解决问题->验证问题
- 在解决问题之前一定要弄清楚具体的问题是什么,看到过太多纠结很久但发现自己所解决的问题并不是测试描述的问题的情况了;
- 解决bug最耗时的地方在于定位问题和分析问题,这个可以借助"二"中介绍的几个方法
二解决问题的方法(排名分先后):
- 借助搜索引擎:遇到有明显的异常信息,且自己并不熟悉为什么异常时候,最高效的解决方法是借助搜索引擎,这里的搜索引擎一定是谷歌,不是百度;借助搜索引擎能解决工作中的大部分bug,你要相信,全世界这么多开发人员,你遇到过的大多数问题其他人也遇到过
- 打印调试法(日志日志调试法):这是最笨但是最有效的办法,人会说谎、断点调试可能会说谎,但是日志一定不会说谎(因为多线程,在多线程状态下以及断点情况下,错误并不能百分百找到以及调试正确位置。)
最基础的日志输出demo
- 二分排除法:当你遇到随机问题、帮助他人解决bug或者遇到自己不熟悉的代码时候,通过屏蔽一部分代码,运行观察问题仍然存在,如果存在则进一步分析屏蔽一部分代码,直到定位到有问题的具体位置为止,这种方法能解决工作中很大一部分疑难杂症
- 小黄鸭调试法:当你向某个对象陈述你的思路时,往往会有意想不到的结果,哪怕对方并不是一个生物
- 断点调试法:受限于效率不高以及在多线程环境下面断点调试并不灵,有必要时候才考虑用这种方法;通常可以使用打印调试法来代替;
- 线上求助:包括论坛提问、微信群提问;不到万不得已不要用这种方法,在有限的圈子里面,你遇到的一个具体技术问题很有可能其他人并没有遇到过,多数时候问了也是白问,但有时候也可能是一种有效的方法
- 冷静法:思维走入了误区,那就放弃吧,转手忙点其他的吧,过会在回来想,可能就豁然开朗了,找到问题了
- 随缘法:通常用在逻辑型的BUG上,代码瞎改,瞎(非真的胡乱整)调整位置,说不准就好了
- 万能解决法:重启软件-重启服务器-重启电脑-换新电脑-重启地球
- 重构法:重头到尾写一遍
解决方案
- 确认Bug是否在本地可以重现
- 确认Bug在哪一段代码中
- 去除所有无关代码,只去调试和Bug相关的代码
- 和之前正常运行的版本对比,尝试恢复到之前可以正常运行的代码
- 重新写一个Demo,确认是否可以正常运行,可以的话,移动代码到原有代码
- 如果本地无法重现,打日志,观察线上行为
- 重启一些东西
- 向大佬提问