发现问题怎么办,如何处理,

所谓的Debug的一般流程是什么,

下面是我对此的一些思考总结,

后面还会继续完善补充。

1.处理思路总纲

  1. 发现问题
  2. 查看日志
  3. 没有日志,去找日志
  4. 找不到日志,继续找,有些藏得比较深
  5. 实在找不到日志,想办法打印日志
  6. 看到日志后,根据错误信息定位问题
  7. 仍然无法定位问题,则继续查看日志
  8. 逐字逐句的看日志,发散联想,是否遇到过类似的
  9. 根据日志给出错误信息谷歌百度
  10. 根据日志给出错误信息咨询他人
  11. 使用远程Debug跟踪代码定位问题
  12. 还不行,吃饭散步休息一下,把上面的步骤重新做一遍
  13. 解决问题
  14. 整理总结
  15. 发布博客

有时间的话,我会把上面的处理流程画一个流程图,

上面给出的是提纲式的Debug问题的步骤,

下面我会详细讲一下我的思考:

2.第一时间去看日志!为什么?

发现问题的时候,很多程序员喜欢靠猜去解决问题,

特别是初级程序员,看到问题一顿操作猛如虎,

最后浪费了半天时间也没能解决,毫无进展,

所以一定要养成习惯:发现问题第一时间去看日志。

其实有的程序员发现问题的时候不看日志也能解决问题,

确实如此,瞎猫也能碰上死耗子,但不建议常用,

更多的是他们曾经遇到过类似的问题,解决过,

所以第二次碰的的时候就不会再需要去看日志了,

这个就会让新入门的程序员以为他们也是靠猜的,

从此就养成了一个不好的习惯,不看日志喜欢靠猜,

有时候自己也会发懒,不去看日志,偶尔有奇效,

但尝试几次未果之后还是要回到正路上来,

查看日志,在哪里看?这是很多人上来便会遇到第一个问题。

3.日志在哪里看?

为此我们要学会找到日志,很多人因为不知道日志在哪里,

所有又回到靠猜的老路去了,这个日志在哪里就是第一道拦路虎,

一般来说业务系统在后台都是有日志文件的,

这些日志文件的路径都是可以配置的,

有的在启动脚本里面,

有的在配置文件里面,

有的甚至做到了前台页面里面,

我们可以看到有启动日志,还有业务日志,操作日志等等

这个需要程序员对系统有一定的熟悉,

不过Java系统一般来说都是差不多的,实际上手操作几下就知道了,

如果还找不到日志,没有办法之时又有人想回去继续靠猜了,

其实这个时候可以使用find和grep在Linux文件系统中搜索一下,

看看是否有可疑的log文件,里面可能有错误信息,比如ERROR之类的。

4.实在找不着日志,该怎么办?

如果实在找不着日志,不要灰心,

我们就要想办法让日志自己出现,

一般情况下,通过配置文件比如log4j配置,

打开相应的日志开关和设置好日志的级别比如DEUBG级别,

我们就可以把指定日志打印到指定的文件,

这样日志就好看多了,当然系统可能也会有其他配置文件,

这个需要自己去问去查,不然日志是不会自己凭空出现的,

如果打印日志的开关和日志级别都搞定了,

却发现我们预期的日志还没有怎么办,

这时候可以考虑远程Debug以及在代码中添加相应的日志,

远程Debug自己去查方法,然后跟着代码一步一步走,

看问题出在哪里了,需要一定的调试经验,需要熟悉代码,

否则简简单单的空指针异常都可以搞得人晕头转向,

明明已经调试到有问题的代码了,却看不出来代码错在哪,

在代码中添加相应的日志,可以是临时的日志也可以是永久的,

如果仅仅为了这次定位问题,打印出来相应的错误信息即可,

之后把临时日志从代码中去除,不要提交到代码库中去,

如果是代码设计上的缺陷,需要打印日志的地方而没有打印,

导致出问题的时候不好定位,就可以把打印日志提交到代码库,

这些缺失日志可能不直接和本次处理的问题相关,

但是为了方便以后定位问题,还是不要偷懒的好。

5.有了日志,该怎么看?

其实能够看到日志的错误信息,我们的问题就解决一大半了,

很多日志打印错误信息非常清楚,一看就能知道怎么解决。

如果不能一眼看出问题所在,就需要仔细查看日志,

逐字逐句的看日志,在脑子里面发散联想,提炼关键信息,

为什么要逐字逐句的看日志,因为关键信息就在日志中,

我们经常发现问题好不容易定位出来,

再回去看日志,发现日志已经提示的很清楚了,

如果能仔细看下日志,就能节省很多的时间,

还有就是以前是否遇到过类似的问题,是怎么处理的,

再接下来就是谷歌百度了,

一般先百度,查看中文内容是否有好的解决方案,

国内主要是CSDN,简书,新浪博客等等还是不错的,

不行再谷歌,查看英文内容是否有好的解决方案,

国外主要是stackoverflow,apache, wiki等官方资料。

查找资料也是需要技巧的,网上有一些资料是过时的失真的,

需要自己辨别,多搜索多看,学会快速找到自己需要的信息,

不迷失在信息的汪洋之中,需要掌握一定搜索技巧和经验积累。

6.休息,重复一遍问题定位过程

有些时候,我们定位问题就是解决不了,看了半天都不知道怎么办,

这个时候就需要先休息一下,可以吃个饭散个步,

然后我们再回来看问题,说不定很快就能解决,

我理解是在长时间定位过程中,人会疲劳,就不容易解决问题,

而且会忽略一下细节的东西,思维定式进入死胡同,

休息一段时间之后,可以更好的集中注意力,

并且思维得到了一定的转换,说不定柳暗花明呢~

7.整理总结,发布博客

将定位问题的过程记录下来,在解决之后整理成文档,

然后将其发布到自己的博客是最好不过了。

记下问题的原始信息,包括错误日志的详细信息,

然后附上详细的解决方法,以后自己遇到类似的问题就很好解决,

虽然将其发布到博客不是必须的,

但是将自己的解决方法共享出去,

既可以帮助别人,也可以帮助自己,

说不定别人能提出更好的解决方法,

过了很近之后即使自己忘记了,还可以在找到。

Debug解决问题方法论的更多相关文章

  1. 如何编写Window服务程序(C# )

    虚拟需求:编写一个Window服务,并注册到操作系统的服务里.让他隔30秒运行一下(写当前日期到一个文本里) 步骤: 创建一个Window 窗体应用程序项目(Greatwall.Mes.Windows ...

  2. 一个IT工薪族的4年奋斗成果

     关于标题:为了方便传播,使用了"最简化"的一段. 过段时间,考虑改为"大学毕业4年-回顾和总结(11):一个IT工薪族的4年奋斗成果(2012年6月17日~2016年6 ...

  3. 谈谈代码评审(code review)

    什么是代码评审(code review)? 根据维基百科的定义,代码评审是一种通过若干人员检阅源代码方式来进行的软件质量保证活动.根据软件工程的经典理论,代码评审应该是收益很高的活动,因其产生在Cod ...

  4. Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注

    一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...

  5. Error establishing a database connection!

    后来发现在 wp-config.php 有个 debug 的参数,打开这个参数,修改为: define('WP_DEBUG','true'); 修改这个后,非常不错,报了很多错,一堆....   使用 ...

  6. jmeter sampler maven项目排错记

    eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...

  7. 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. ...

  8. Node程序debug小记

    有时候,所见并不是所得,有些包,你需要去翻他的源码才知道为什么会这样. 背景 今天调试一个程序,用到了一个很久之前的NPM包,名为formstream,用来将form表单数据转换为流的形式进行接口调用 ...

  9. 如何使用google解决问题

    如何使用google解决问题 redguardtoo著 文章选自2004年<程序员>杂志第8期P56 前面收集了篇如何问问题的文章就是<学会提问>http://blog.pro ...

随机推荐

  1. 【Linux】【Services】【VersionControl】Git基础概念及使用

    1. 简介 1.1. 版本控制工具: 本地版本控制系统: 集中化版本控制系统:CVS,SVN 分布式版本控制系统: BitKeeper,Git 1.2. 官方网站: https://git-scm.c ...

  2. virtualbox Linux安装增强功能

    1.点击<设备>--><安装增强功能> 2.创建安装包挂载目录,并挂载 #创建挂载目录 mkdir /mnt/cdrom #挂载光盘内容 mount -t auto -r ...

  3. MyBatis(2):CRUD操作

    编写接口 import com.shandx.pojo.User; import java.util.List; public interface UserMapper { <span clas ...

  4. shell脚本实现网站日志分析统计

    如何用shell脚本分析与统计每天的访问日志,并发送到电子邮箱,以方便每天了解网站情况.今天脚本小编为大家介绍一款不错的shell脚本,可以实现如上功能. 本脚本统计了:1.总访问量2.总带宽3.独立 ...

  5. sqlserver 删除表分区

    我们都知道,SQL server2008R2企业版以及一些其它的版本支持分区函数,当你在这些数据库备份后想在一些不支持分区函数的数据库做还原时,就会失败. 下面我们来解决这个问题. 1.备份数据库!备 ...

  6. java代码从出生到执行的过程浅析

    阅读<深入理解java虚拟机 第二版 JVM高级特性与最佳实践> - jdk版本为1.6 1.什么是编译型语言.解释型语言 解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码, ...

  7. 【Matlab】向图像域添加噪声/高斯/均匀/伽马/指数/椒盐

    [向图像域添加噪声] matlab自带一个函数:imnoise,可以对图像添加噪声. Matlab的说明 https://www.mathworks.com/help/images/ref/imnoi ...

  8. .net core Winform 添加DI和读取配置、添加log

    首先新建配置类 public class CaptureOption { /// <summary> /// 是否自启 /// </summary> public bool A ...

  9. Gitlab更改项目间的fork提交关系

    目录 一.前情提要 二.实际操作 一.前情提要 1.dzsw/cgd_xx项目,通过fork按钮在dzsw_dev组下面同步了一个项目 2.但是现在dzsw/cgd_xx项目因为没法提交合并请求,一点 ...

  10. Python利用ctypes实现C库函数调用

    0X00 ctypes 是强大的,使用它我们就能够调 用动态链接库中函数,同时创建各种复杂的 C 数据类型和底层操作函数.使得python也具备了底层内存操作的能力,再配合python本身强大的表达能 ...