在无法单步调试的情况下找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的根源所在。
转载于:https://www.cnblogs.com/qrlozte/p/3515881.html
在无法单步调试的情况下找Bug的技巧相关推荐
- linux单步调试方法,linux下gdb单步调试(中).doc
linux下gdb单步调试(中) linux下gdb单步调试(中) linux下gdb单步调试(中) 一.设置断点( BreakPoint ) 我们用 break 命令来设置断点.正面有几点设置断点的 ...
- 无法在web服务器上启动调试。未能启动asp.net调试。在不调试的情况下启动项目也许能获得更多信息。
出现这个问题的原因是网站的应用程序池选择不正确 解决方法是(IIS7.0): 进入IIS管理器----->右键你自己的网站名字------->管理网站-------->高级设置--- ...
- @Java web程序员,在保留现场,服务不重启的情况下,执行我们的调试代码(JSP 方式)
阅读目录 一.前言 二.问题描述 1.问题代码 2.jsp文件代码 3.执行 jsp 三.总结 回到顶部 一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tom ...
- 还在肉眼找bug??赶紧进来!!!程序员一定要学的调试技巧.
本文介绍了什么是bug,什么是调试,调试重要性,如何调试解决bug,各种常用的调试快捷键,如何写出好代码以及const关键字,assert断言库函数介绍,写代码各种遇见的错误, 调试训练 实用调试技巧 ...
- IDEA 调试图文教程,让bug无处藏身!
Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...
- 程序员从复杂代码中找BUG的5种方法,你用过几个?
有不少的新手程序员,刚开始都是从修BUG开始做起的. 修bug有助于熟悉项目,了解大概哪些类参与了执行线路,相互调用关系又是如何,结构设计上有什么特点. 对于新手程序员而言,在复杂代码中找BUG是一个 ...
- linux下gdb单步调试
用 GDB调试程序 GDB 概述 ---- GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 IDE的调试,但如果你是在 ...
- linux下动态链接库使用与单步调试
//动态库调试时,可以在库函数中设置断点,使用n代表不进入库函数单步调试,使用s代//表进入库函数单步调试 //注意:可以使用ldd libtest.so查看动态库的依赖情况 //在默认情况下,运行时 ...
- java后门_@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码...
从数据库.redis取了些数据,做了一些运算后,没抛异常,但是就是结果不对 抛了个空指针异常,但是看代码,感觉没问题,是取出来就是空,还是中间什么函数把它改坏了 发现导致一个bug的原因是用了JVM缓 ...
最新文章
- 华北理工大学轻工学院计算机在哪个校区,如何坐公交去路北区的华北理工大学轻工学院(北校区)-行政综合楼| Moovit...
- 为了熟悉再一次的配置Postfix
- Spark配置属性整理(非常全面)
- mpvue小程序架构搭建详细介绍
- css画钟表_纯Shading Language绘制HTML5时钟
- java redis 批量删除key_互联网大厂Java工程师面试指南——Redis篇
- AOP 的作用及其优势
- C语言exchange函数,C++指针作为函数参数
- WTL学习笔记——初章
- (55)FPGA条件选择无优先级(if-else)
- 《原力计划【第二季】》第 2 周周榜揭晓!!!
- Management reporter 2012 与AX 2012
- 酒店管理系统(功能结构图、E-R图、用例图)
- 新计算机的word无法输入文字,【WORD为什么无法输入文字?】word如何转换excel
- 曲线积分于曲面积分(后篇 曲面积分-坐标曲面积分-高斯公式-斯托克斯公式)
- [backtrack教程]从零开始,教你如何破解WEP、WPA无线网络
- 10激活网页被劫持_新手学习SEO需掌握的10大SEO技能
- C# 获取当前获得焦点的控件
- Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
- httPs//yy7com/a1phP,header.php
热门文章
- 【基础】排序算法学习笔记
- 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
- evt参数是干啥用的_女朋友问我,Java8 Optional 到底干啥用的?
- 1008 数组元素右移k位
- c++排序算法之 快速排序
- C++ 引用以及和指针的区别
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
- 最大表示法--环形字符串最大字典序(HDU 5442)
- 图像卷积详细解释 常用卷积核解释说明
- [汇编语言计算机原理] 带开机音乐,速度、进度和行驶方向显示的出租出计费系统设计