在无法单步调试的情况下找Bug的技巧
比如说你有一个大的模块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的技巧的更多相关文章
- EasyUI特殊情况下的BUG整理
前面有两篇: Easyui - combo[tree,box]下拉图标有间隙bug解决方法 http://blog.csdn.net/isea533/article/details/12996561 ...
- Spring3+mybatis3在多数据源情况下找不到数据库驱动的问题
解决问题的过程如下: 1.遇到问题和一般的解决方法和下面这个帖子的一样: http://www.oschina.net/question/188964_32305 2.我在按照1的做法配置了以后,依然 ...
- 有复选框情况下,sql拼写技巧
复选框选中只取合格的数据,没有选中取所有的数据. string filterOk = (ckbOnlyOk.Checked ? " and (jyjg='合格') " : &quo ...
- @Java web程序员,在保留现场,服务不重启的情况下,执行我们的调试代码(JSP 方式)
一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 了不得, ...
- 如何使用vs2012单步调试uGUI(unity3d 5.3f4)
下载uGUI源代码 uGUI源代码地址:https://bitbucket.org/Unity-Technologies/ui 下载代码工具:tortoisehg-3.6.2-x64.msi http ...
- IDEA 调试图文教程,让 bug 无处藏身!
阅读本文大概需要 6.2 分钟. 来源:http://t.cn/EoPN7J2 Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行 ...
- 【js】前台调试,在浏览器调试环境下找不到js怎么办?
针对这次 整个项目单页面的情况下,所有点击出现的新页面都是追加在母页面的情况下,很多时候不像原本的情况,可以直接在浏览器的调试环境下找到想要调试的js代码 这种情况下,怎么能找到子页面的js代码,调试 ...
- php 502 无错误行和报错文件的情况下使用gdb调试方法
lnmp环境 gdb /usr/local/php5.2/bin/php-cgi /tmp/coredump-php-cgi.20503 source /home/tmp/lnmp1.4-full ...
- python3 在文件确实存在的情况下,运行提示找不到文件
提示 [Errno 2] No such file or directory: 但是路径下确实存在此文件,在不改动的情况下,再次运行,执行成功. 百思不得其解,看到此链接下的回答 http://bbs ...
随机推荐
- 要做的题目-要用到hadoop资源
关于项目,我出两个练手题目: 一.多机数据处理.有 10 台机器,每台机器上保存着 10 亿个 64-bit 整数(不一定刚好 10 亿个,可能有上下几千万的浮动),一共约 100 亿个整数(其实一共 ...
- ExtJS ComboBox 录入智能提示
ExtJS ComboBox非常复杂,有很多的属性:其中有的属性是针对某一种特定的方案而设计的,不是所有情况下都有效.我想下拉选择能支持录入,并且录入时能智能提示,弄了半天可以了,但是只能是mode= ...
- 虚机启动失败-Event 1069
Failover cluster中的一台虚机启动失败. 报错如下: 文字信息关键字如下: Event 1069; Event 21502; 0x80004005; Cluster resource ' ...
- Android -- Options Menu,Context Menu,Popup Menu
Options Menu 创建选项菜单的步骤: 1. ...
- 【python】如何安装requests
在cmd窗口输入pip install requests 即可,如下 C:\Users\horn1\Desktop\python\4>pip install requestsCollecting ...
- Cocos2d-x源代码解析(1)——地图模块(1)
cocos通过加载tiled 生成的tmx文件来生成游戏地图.本文主要分析cocos加载地图模块的源代码. 如图所看到的,地图加载模块由以上几个类组成. 对外的入口是类CCTMXTiledMap, ...
- SQL2005 镜像配置
新添加了一台服务器,做原来服务器的备份机,用交叉线+双网卡配置了内网. 系统环境:Windows 2008 R2 数据库:SQL2005 SP3 设置镜像可以用证书和域两种情况,不过域设置的权限比 ...
- android.content.res.Resources$NotFoundException: String resource ID #0x0
仔细检查是不是在settext的时候设置进去的时int属性的值,所以android会认为这是在strings中的值,所以会拿着这个int值当做string的id值去找,结果当然是找不到的.
- ubuntu12.04下helloworld驱动从失败到成功过程
最近在看linux的设备驱动程序,写一个简单的helloworld程序都花了我好久的时间,具体过程如下: 编写helloworld.c 编写Makefile 注意,makefile中的命令那里是一个t ...
- css3和html5的学习
本文是此链接的源代码.http://www.imooc.com/learn/77 关于的html5的使用: transition----含义是:过渡的过程,能够对各种属性设置变化. 有5中过渡的形式: ...