Debug解决问题方法论
发现问题怎么办,如何处理,
所谓的Debug的一般流程是什么,
下面是我对此的一些思考总结,
后面还会继续完善补充。
1.处理思路总纲
- 发现问题
- 查看日志
- 没有日志,去找日志
- 找不到日志,继续找,有些藏得比较深
- 实在找不到日志,想办法打印日志
- 看到日志后,根据错误信息定位问题
- 仍然无法定位问题,则继续查看日志
- 逐字逐句的看日志,发散联想,是否遇到过类似的
- 根据日志给出错误信息谷歌百度
- 根据日志给出错误信息咨询他人
- 使用远程Debug跟踪代码定位问题
- 还不行,吃饭散步休息一下,把上面的步骤重新做一遍
- 解决问题
- 整理总结
- 发布博客
有时间的话,我会把上面的处理流程画一个流程图,
上面给出的是提纲式的Debug问题的步骤,
下面我会详细讲一下我的思考:
2.第一时间去看日志!为什么?
发现问题的时候,很多程序员喜欢靠猜去解决问题,
特别是初级程序员,看到问题一顿操作猛如虎,
最后浪费了半天时间也没能解决,毫无进展,
所以一定要养成习惯:发现问题第一时间去看日志。
其实有的程序员发现问题的时候不看日志也能解决问题,
确实如此,瞎猫也能碰上死耗子,但不建议常用,
更多的是他们曾经遇到过类似的问题,解决过,
所以第二次碰的的时候就不会再需要去看日志了,
这个就会让新入门的程序员以为他们也是靠猜的,
从此就养成了一个不好的习惯,不看日志喜欢靠猜,
有时候自己也会发懒,不去看日志,偶尔有奇效,
但尝试几次未果之后还是要回到正路上来,
查看日志,在哪里看?这是很多人上来便会遇到第一个问题。
3.日志在哪里看?
为此我们要学会找到日志,很多人因为不知道日志在哪里,
所有又回到靠猜的老路去了,这个日志在哪里就是第一道拦路虎,
一般来说业务系统在后台都是有日志文件的,
这些日志文件的路径都是可以配置的,
有的在启动脚本里面,
有的在配置文件里面,
有的甚至做到了前台页面里面,
我们可以看到有启动日志,还有业务日志,操作日志等等
这个需要程序员对系统有一定的熟悉,
不过Java系统一般来说都是差不多的,实际上手操作几下就知道了,
如果还找不到日志,没有办法之时又有人想回去继续靠猜了,
其实这个时候可以使用find和grep在Linux文件系统中搜索一下,
看看是否有可疑的log文件,里面可能有错误信息,比如ERROR之类的。
4.实在找不着日志,该怎么办?
如果实在找不着日志,不要灰心,
我们就要想办法让日志自己出现,
一般情况下,通过配置文件比如log4j配置,
打开相应的日志开关和设置好日志的级别比如DEUBG级别,
我们就可以把指定日志打印到指定的文件,
这样日志就好看多了,当然系统可能也会有其他配置文件,
这个需要自己去问去查,不然日志是不会自己凭空出现的,
如果打印日志的开关和日志级别都搞定了,
却发现我们预期的日志还没有怎么办,
这时候可以考虑远程Debug以及在代码中添加相应的日志,
远程Debug自己去查方法,然后跟着代码一步一步走,
看问题出在哪里了,需要一定的调试经验,需要熟悉代码,
否则简简单单的空指针异常都可以搞得人晕头转向,
明明已经调试到有问题的代码了,却看不出来代码错在哪,
在代码中添加相应的日志,可以是临时的日志也可以是永久的,
如果仅仅为了这次定位问题,打印出来相应的错误信息即可,
之后把临时日志从代码中去除,不要提交到代码库中去,
如果是代码设计上的缺陷,需要打印日志的地方而没有打印,
导致出问题的时候不好定位,就可以把打印日志提交到代码库,
这些缺失日志可能不直接和本次处理的问题相关,
但是为了方便以后定位问题,还是不要偷懒的好。
5.有了日志,该怎么看?
其实能够看到日志的错误信息,我们的问题就解决一大半了,
很多日志打印错误信息非常清楚,一看就能知道怎么解决。
如果不能一眼看出问题所在,就需要仔细查看日志,
逐字逐句的看日志,在脑子里面发散联想,提炼关键信息,
为什么要逐字逐句的看日志,因为关键信息就在日志中,
我们经常发现问题好不容易定位出来,
再回去看日志,发现日志已经提示的很清楚了,
如果能仔细看下日志,就能节省很多的时间,
还有就是以前是否遇到过类似的问题,是怎么处理的,
再接下来就是谷歌百度了,
一般先百度,查看中文内容是否有好的解决方案,
国内主要是CSDN,简书,新浪博客等等还是不错的,
不行再谷歌,查看英文内容是否有好的解决方案,
国外主要是stackoverflow,apache, wiki等官方资料。
查找资料也是需要技巧的,网上有一些资料是过时的失真的,
需要自己辨别,多搜索多看,学会快速找到自己需要的信息,
不迷失在信息的汪洋之中,需要掌握一定搜索技巧和经验积累。
6.休息,重复一遍问题定位过程
有些时候,我们定位问题就是解决不了,看了半天都不知道怎么办,
这个时候就需要先休息一下,可以吃个饭散个步,
然后我们再回来看问题,说不定很快就能解决,
我理解是在长时间定位过程中,人会疲劳,就不容易解决问题,
而且会忽略一下细节的东西,思维定式进入死胡同,
休息一段时间之后,可以更好的集中注意力,
并且思维得到了一定的转换,说不定柳暗花明呢~
7.整理总结,发布博客
将定位问题的过程记录下来,在解决之后整理成文档,
然后将其发布到自己的博客是最好不过了。
记下问题的原始信息,包括错误日志的详细信息,
然后附上详细的解决方法,以后自己遇到类似的问题就很好解决,
虽然将其发布到博客不是必须的,
但是将自己的解决方法共享出去,
既可以帮助别人,也可以帮助自己,
说不定别人能提出更好的解决方法,
过了很近之后即使自己忘记了,还可以在找到。
Debug解决问题方法论的更多相关文章
- 如何编写Window服务程序(C# )
虚拟需求:编写一个Window服务,并注册到操作系统的服务里.让他隔30秒运行一下(写当前日期到一个文本里) 步骤: 创建一个Window 窗体应用程序项目(Greatwall.Mes.Windows ...
- 一个IT工薪族的4年奋斗成果
关于标题:为了方便传播,使用了"最简化"的一段. 过段时间,考虑改为"大学毕业4年-回顾和总结(11):一个IT工薪族的4年奋斗成果(2012年6月17日~2016年6 ...
- 谈谈代码评审(code review)
什么是代码评审(code review)? 根据维基百科的定义,代码评审是一种通过若干人员检阅源代码方式来进行的软件质量保证活动.根据软件工程的经典理论,代码评审应该是收益很高的活动,因其产生在Cod ...
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- Error establishing a database connection!
后来发现在 wp-config.php 有个 debug 的参数,打开这个参数,修改为: define('WP_DEBUG','true'); 修改这个后,非常不错,报了很多错,一堆.... 使用 ...
- jmeter sampler maven项目排错记
eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...
- QT使用MySql的配置(使用addLibraryPath载入插件),编译QT的MySql驱动问题及解决方案(自己使用libmysql.lib进行编译mysql.pro,万不得已可以查看Makefile.Debug以解决问题)
2010/04/23:Fixes : 更新批处理,以兼容WIN7. 第一次系统地玩QT,于是诞生了此预备式: [QT版本4.6.0(VS2008编译版),开发平台推荐使用Qt Creator(最新1. ...
- Node程序debug小记
有时候,所见并不是所得,有些包,你需要去翻他的源码才知道为什么会这样. 背景 今天调试一个程序,用到了一个很久之前的NPM包,名为formstream,用来将form表单数据转换为流的形式进行接口调用 ...
- 如何使用google解决问题
如何使用google解决问题 redguardtoo著 文章选自2004年<程序员>杂志第8期P56 前面收集了篇如何问问题的文章就是<学会提问>http://blog.pro ...
随机推荐
- 视频框架 Vitamio使用
转自http://blog.csdn.net/u010181592/article/category/5893483 1.在https://github.com/yixia/VitamioBundle ...
- Windows 下 Node.js 开发环境搭建
1.利用CentOS Linux系统自带的yum命令安装.升级所需的程序库: sudo -s LANG=C yum -y install gcc gcc-c++ autoconf libjpeg li ...
- Private Destructor
Predict the output of following programs. 1 #include <iostream> 2 using namespace std; 3 4 cla ...
- 【Linux】【Shell】【Basic】Bash
命令历史:shell进程会在其会话中保存此前用户提交执行过的命令: ------------------------------------------------------------------ ...
- SQL错误总结
ORA-00918: column ambiguously defined 异常原因: select 查询的字段在from的两张表中都存在,导致数据库无法区别需要查询的字段来自于哪张表 以下是例子 s ...
- 过滤敏感词工具类SensitiveFilter
网上过滤敏感词工具类有的存在挺多bug,这是我自己改用的过滤敏感词工具类,目前来说没啥bug,如果有bug欢迎在评论指出 使用前缀树 Trie 实现的过滤敏感词,树节点用静态内部类表示了,都写在一个 ...
- 我写了个IDEA开源插件,vo2dto 一键生成对象转换
让人头疼的对象转换 头炸,po2vo.vo2do.do2dto,一堆对象属性,取出来塞进来.要不是为了 DDD 架构下的各个分层防腐,真想一竿子怼下去. 那上 BeanUtils.copyProper ...
- IDEA设置默认(指定)的注释作者信息
有时候我们想在IDEA里面创建的时候就默认设置一个指定的作者信息 填入作者信息 然后点击ok /** * * @author yvioo */ 然后我们新建文件的时候就会自动带上这个了,模板可以根据自 ...
- windows10源码编译llvm
准备 cmake, 我目前使用的版本是3.18 llvm 源码, 我下载的是 11.0 我已经具备Vs2015和Vs2017的开发环境. debug模式编译需要较多内存和较多硬盘存储空间. (debu ...
- Qt5获取可用串口
概述 本文将介绍Qt5使用类QSerialPortInfo获取可以用串口号 效果 机器上配置的虚拟串口 程序获取结果 源码开始 .pro文件中添加下面的代码 QT += serialport 然后,执 ...