比如说你有一个大的模块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的技巧相关推荐

  1. linux单步调试方法,linux下gdb单步调试(中).doc

    linux下gdb单步调试(中) linux下gdb单步调试(中) linux下gdb单步调试(中) 一.设置断点( BreakPoint ) 我们用 break 命令来设置断点.正面有几点设置断点的 ...

  2. 无法在web服务器上启动调试。未能启动asp.net调试。在不调试的情况下启动项目也许能获得更多信息。

    出现这个问题的原因是网站的应用程序池选择不正确 解决方法是(IIS7.0): 进入IIS管理器----->右键你自己的网站名字------->管理网站-------->高级设置--- ...

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

    阅读目录 一.前言 二.问题描述 1.问题代码 2.jsp文件代码 3.执行 jsp 三.总结 回到顶部 一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tom ...

  4. 还在肉眼找bug??赶紧进来!!!程序员一定要学的调试技巧.

    本文介绍了什么是bug,什么是调试,调试重要性,如何调试解决bug,各种常用的调试快捷键,如何写出好代码以及const关键字,assert断言库函数介绍,写代码各种遇见的错误, 调试训练 实用调试技巧 ...

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

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...

  6. 程序员从复杂代码中找BUG的5种方法,你用过几个?

    有不少的新手程序员,刚开始都是从修BUG开始做起的. 修bug有助于熟悉项目,了解大概哪些类参与了执行线路,相互调用关系又是如何,结构设计上有什么特点. 对于新手程序员而言,在复杂代码中找BUG是一个 ...

  7. linux下gdb单步调试

    用 GDB调试程序 GDB 概述 ---- GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 IDE的调试,但如果你是在 ...

  8. linux下动态链接库使用与单步调试

    //动态库调试时,可以在库函数中设置断点,使用n代表不进入库函数单步调试,使用s代//表进入库函数单步调试 //注意:可以使用ldd libtest.so查看动态库的依赖情况 //在默认情况下,运行时 ...

  9. java后门_@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码...

    从数据库.redis取了些数据,做了一些运算后,没抛异常,但是就是结果不对 抛了个空指针异常,但是看代码,感觉没问题,是取出来就是空,还是中间什么函数把它改坏了 发现导致一个bug的原因是用了JVM缓 ...

最新文章

  1. 华北理工大学轻工学院计算机在哪个校区,如何坐公交去路北区的华北理工大学轻工学院(北校区)-行政综合楼| Moovit...
  2. 为了熟悉再一次的配置Postfix
  3. Spark配置属性整理(非常全面)
  4. mpvue小程序架构搭建详细介绍
  5. css画钟表_纯Shading Language绘制HTML5时钟
  6. java redis 批量删除key_互联网大厂Java工程师面试指南——Redis篇
  7. AOP 的作用及其优势
  8. C语言exchange函数,C++指针作为函数参数
  9. WTL学习笔记——初章
  10. (55)FPGA条件选择无优先级(if-else)
  11. 《原力计划【第二季】》第 2 周周榜揭晓!!!
  12. Management reporter 2012 与AX 2012
  13. 酒店管理系统(功能结构图、E-R图、用例图)
  14. 新计算机的word无法输入文字,【WORD为什么无法输入文字?】word如何转换excel
  15. 曲线积分于曲面积分(后篇 曲面积分-坐标曲面积分-高斯公式-斯托克斯公式)
  16. [backtrack教程]从零开始,教你如何破解WEP、WPA无线网络
  17. 10激活网页被劫持_新手学习SEO需掌握的10大SEO技能
  18. C# 获取当前获得焦点的控件
  19. Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
  20. httPs//yy7com/a1phP,header.php

热门文章

  1. 【基础】排序算法学习笔记
  2. 电容的q值计算公式_(生活小贴士)一分钟了解“三星贴片电容的结构与材料特性”...
  3. evt参数是干啥用的_女朋友问我,Java8 Optional 到底干啥用的?
  4. 1008 数组元素右移k位
  5. c++排序算法之 快速排序
  6. C++ 引用以及和指针的区别
  7. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
  8. 最大表示法--环形字符串最大字典序(HDU 5442)
  9. 图像卷积详细解释 常用卷积核解释说明
  10. [汇编语言计算机原理] 带开机音乐,速度、进度和行驶方向显示的出租出计费系统设计