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 ...
随机推荐
- Spring Boot发布war包流程
1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都是jar,因此要修改默认的打包方式jar为wa ...
- 10.Object类
在JAVA中,所有的类都直接或间接继承了Java.lang.Object类Object是一个特殊的类,他是所有类的父类,是Java类层中的最高层类.当创建一个类时,他总是在继承,除非某个类已经指定要从 ...
- java多线程5:线程间的通信
在多线程系统中,彼此之间的通信协作非常重要,下面来聊聊线程间通信的几种方式. wait/notify 想像一个场景,A.B两个线程操作一个共享List对象,A对List进行add操作,B线程等待Lis ...
- secret_file
拿到题目例行检查,进入main函数 这个逆向有些复杂,程序首先让我们像dest输入256个字符,我们可以看到关键的strcmp(v15,v17),若相等则执行poppen poppen这个函数有额外的 ...
- 复杂SQL案例:用户听课情况查询
供参考: select h.course_id, h.course_type, i.course_title, r.id res_id, r.res_title, h.user_id, u.user_ ...
- SpringBoot整合Netty实现socket通讯简单demo
依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifa ...
- 辅助函数和高阶函数 map、filter、reduce
辅助函数和高阶函数 map.filter.reduce: 一.辅助函数:(1-1)响应式函数 (数组更新检测): push() pop() shift() unshift() ...
- 【LeetCode】107. Binary Tree Level Order Traversal II 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:迭代 日期 [LeetCode ...
- 【LeetCode】694. Number of Distinct Islands 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- 【LeetCode】206. Reverse Linked List 解题报告(Python&C++&java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 [LeetCode] 题目地址:h ...