比如说你有一个大的模块A,其组成部分有B,C,D这3个小的模块,现在A出了一个BUG,因为某种原因的限制你无法单步调试。怎么较快地定位BUG发生的根源?

这里记录一下刚才我在找BUG的时候采用的思路,为了具体化,我就以这篇文章提到的问题为例http://www.cnblogs.com/qrlozte/p/3515836.html

  login.jsp >>> 用户输入id和密码

  LoginServlet >>> 数据库查询,验证,如果验证通过,在session中保存用户id,然后跳转到welcome.jsp,否则跳转到login.jsp显示错误信息

  welcome.jsp >>> 根据session中的用户id显示相应的信息

  BUG:在LoginServlet中,用户id保存在session中,但是在没有关闭浏览器的情况下session中的用户id就丢失了,症状是session.getAttribute(用户id)返回null

我的思路如下,总之就是复杂问题简单化,瘦身法!:

  1、数据库验证这一块是没有问题的,因为数据库验证的代码在别的地方也使用过并且功能正常。

    >>> 删掉数据库验证以及根据验证结果进行逻辑判断的代码,LoginServlet只做一件事:把用户id保存到session中,然后跳转到welcome.jsp

    >>> 测试,问题仍然存在,说明BUG的确跟数据库验证的代码无关

  2、welcome.jsp是没有问题的,因为我即便不让LoginServlet跳转到welcome.jsp,session中的用户id照样会丢失

    >>> 删掉welcome.jsp,LoginServlet不跳转到welcome.jsp,仅仅把用户id保存到session中

    >>> 测试,问题仍然存在,说明BUG的确跟welcome.jsp无关

  3、因为LoginServlet只做了2件事,request.getParameter,request.getSession().setAttribute(),不能再瘦身了,我基本上可以确认LoginServlet是没有问题的

    >>> 确认LoginServlet的正确性

那么现在问题只可能出在login.jsp身上了,经过同样的思路,很快就把问题聚焦到了action那里,也就找到了BUG的根源所在

实际上,跟上面所谓的“瘦身法”对应的另一种方法也很高效,“问题还原法”:先根据你出BUG模块的基本逻辑框架(比如这里的提交->验证->跳转),搭建一个尽可能精简的模块,扔掉一切多余的代码。在这种情况下,因为代码很精简,你很可能发现BUG不见了,但是你也不知道BUG究竟源自哪里,没关系,慢慢添加代码,把你的精简版模块慢慢地还原为完整版的模块,这个过程其实也就是还原问题的过程,一旦你找到了BUG消失和BUG出现的那个临界点,你实际上就找到BUG的根源所在。

在无法单步调试的情况下找Bug的技巧的更多相关文章

  1. EasyUI特殊情况下的BUG整理

    前面有两篇: Easyui - combo[tree,box]下拉图标有间隙bug解决方法 http://blog.csdn.net/isea533/article/details/12996561 ...

  2. Spring3+mybatis3在多数据源情况下找不到数据库驱动的问题

    解决问题的过程如下: 1.遇到问题和一般的解决方法和下面这个帖子的一样: http://www.oschina.net/question/188964_32305 2.我在按照1的做法配置了以后,依然 ...

  3. 有复选框情况下,sql拼写技巧

    复选框选中只取合格的数据,没有选中取所有的数据. string filterOk = (ckbOnlyOk.Checked ? " and (jyjg='合格') " : &quo ...

  4. @Java web程序员,在保留现场,服务不重启的情况下,执行我们的调试代码(JSP 方式)

    一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 了不得, ...

  5. 如何使用vs2012单步调试uGUI(unity3d 5.3f4)

    下载uGUI源代码 uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 下载代码工具:tortoisehg-3.6.2-x64.msi http ...

  6. IDEA 调试图文教程,让 bug 无处藏身!

    阅读本文大概需要 6.2 分钟. 来源:http://t.cn/EoPN7J2 Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行 ...

  7. 【js】前台调试,在浏览器调试环境下找不到js怎么办?

    针对这次 整个项目单页面的情况下,所有点击出现的新页面都是追加在母页面的情况下,很多时候不像原本的情况,可以直接在浏览器的调试环境下找到想要调试的js代码 这种情况下,怎么能找到子页面的js代码,调试 ...

  8. php 502 无错误行和报错文件的情况下使用gdb调试方法

    lnmp环境 gdb  /usr/local/php5.2/bin/php-cgi  /tmp/coredump-php-cgi.20503 source /home/tmp/lnmp1.4-full ...

  9. python3 在文件确实存在的情况下,运行提示找不到文件

    提示 [Errno 2] No such file or directory: 但是路径下确实存在此文件,在不改动的情况下,再次运行,执行成功. 百思不得其解,看到此链接下的回答 http://bbs ...

随机推荐

  1. Android studio如何导出.so库(NDK开发入门)

    转自:http://blog.csdn.net/ssy_neo/article/details/51758687 项目中用到了硬件调试,google一下拿到了硬件调试的源码,可惜握草so库根本加载不进 ...

  2. go语言基础之不同作用域同名变量

    1.不同作用域同名变量 示例: package main import "fmt" var a byte //全局变量 func main() { var a int //局部变量 ...

  3. go语言基础之普通参数列表

    1.普通参数列表 (备注:只有一个参数) 示例1: package main //必须有一个main包 import "fmt" //有参无返回值函数的定义,普通参数列表 //定义 ...

  4. go语言基础之break和continue的区别

    1.break和continue的区别 在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环. 2.break 备注:break可⽤于fo ...

  5. 给电脑装完系统之后,发现U盘少了几个G!

    我的U盘是8个G的,有一次用U盘给电脑装完系统,过了几天后再次用的时候发现U盘 突然少了几个G,刚开始不知道怎么回事,然后就格式化U盘,但是格式化之后没有任何 变化. 在网上搜了一下,说是U盘有可能被 ...

  6. Android开发者指南(9) —— ProGuard

    转: 前言 本章内容为开发者指南(Dev Guide)/Developing/Tools/ProGuard,本章内容为"混淆器",版本为Android3.0 r1,翻译来自:&qu ...

  7. GIL线程全局锁 协程

    GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务 ...

  8. VMWare Workstation 15 serial number

    Serial number:YZ718-4REEQ-08DHQ-JNYQC-ZQRD0 该Key仅供体验,支持正版,从我做起. 点击此处购买正版

  9. 自己定义UIView以实现自绘

    有时候我们须要自绘uiview以实现自己的需求,比方依据坐标点绘制出连续的曲线(股票走势图),就须要自绘uiview了. 原理:继承uiview类(customView),并实现custom view ...

  10. Jquery中对checkbox的各种“全选”或者“取消”功能实现(特别注意1.6+的一定不能使用attr来取属性了!用prop!)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...