精华内容
下载资源
问答
  • bug排查小技巧提问步入正题之前,我提两个问题:开发为测试列出的几大症状:问题描述不清对bug定位不准不理解需求如何高效地排查问题呢?产生问题的原因排查问题 提问 步入正题之前,我提两个问题: 在工作中,你们...

    以下总结以web测试为例,其他类型测试可参考。

    波小艺

    提问

    步入正题之前,我提两个问题:

    • 在工作中,你们发现“bug”是立马给开发提bug单还是先自己尝试排查一下bug产生的原因呢?
    • 提bug单的时候,是怎么描述bug呢?

    相信有不少人测试在发现bug之后,立马给开发提了bug,很少去排查bug产生的原因。

    在开发准备修复bug的时候,发现测试提的“bug”描述不清,不知道如何复现,只能自己琢磨或者叫QA来演示一遍,最尴尬的是,可能在测试演示完之后,才发现这个并非bug,而是由于QA的不规范导致的。这样就会引起开发的不满,觉得测试在浪费他们的时间。

    所以在我们发现问题的时候,首先要做的第一件事就是需要确认一下是否是我们本身测试的不规范导致的。若不确定,可再尝试进行复现。bug描述一定要写具体,否则不仅浪费开发的时间,也会浪费自己的时间。

    开发为测试列出的几大症状:

    问题描述不清

    说明bug要么开局一张图,要么一句话,开发复现bug全靠蒙。

    开发:

    image.png

    正确姿势: 问题应该有详情的描述,图文并茂,场景说明,以及bug出现的流程,对应账号密码等。

    对bug定位不准

    bug瞎指派。前端的bug指给后端,后端的bug指给前端。

    开发:

    image.png
    正确姿势: 分析错误产生的原因,分析是前端还是后端产生的bug,123砸过去😌

    不理解需求

    总是测一些生产环境中根本不可能存在的情况。甚至有些需求就是如此设计,不管三七二十一直接提bug。
    开发:

    image.png
    正确姿势: 先把需求理清楚,设计用例的时候,把一些实际不可能发生的事情剔除掉。

    如何高效地排查问题呢?

    步入今天的正题,来,跟着我,从我的世界走一走。

    产生问题的原因

    • 不理解需求
    • 配置不对
    • 造数不对:包含不可能存在的逻辑
    • 服务有bug

    排查问题

    • 新上一个功能时,发现前端页面展示还是旧的,发起请求还报错?
      • 如果部署没问题的话,那么大概率是前端存在缓存,可清除缓存试试。这里就有个问题:如果功能发到live,但是由于前端存在缓存,用户没没有清除缓存,那们从前端向后端服务器请求时,一直报错,一旦被投诉,那这个锅就是你来背了。
    • 分辨是前端的锅还是后端的锅。前端的锅不仅仅只有UI的问题,需要发起请求,处理请求,并渲染到前端。
      • 出现问题时,可先判断接口是否有错误,返回的结果是否符合预期。若接口无错误且接口返回符合预期,但前端展示不符合预期,应该由前端负责修复。
      • 若接口有报错,可优先确认,前端有没有按照约定的格式向后端发起请求,如果没有,那么前端需要负责修复。
      • 若接口报错,前端也按照约定的格式发起请求,那么锅就在后端了,接着可继续往下走,继续排查问题出现的原因。
    • 可通过接口返回的错误信息去猜测错误的来源
      • 响应码。可根据返回的响应码去定位问题。需要大家熟悉这些响应码。

        分类分类描述
        1**信息,服务器收到请求,需要请求者继续执行操作
        2**成功,操作被成功接收并处理
        3**重定向,需要进一步的操作以完成请求
        4**客户端错误,请求包含语法错误或无法完成请求
        5**服务器错误,服务器在处理请求的过程中发生了错误
      • 响应头。一般后端返回的错误信息会放在响应头中,如果你们不会将错误信息放在响应头的话,可忽略这个。

      • 响应体。如果请求报错的话,接口一般会返回错误信息以及错误码,可通过这些去定位问题。在源代码中输入错误信息定位报错的具体位置(全局搜索),再根据前后调用去分析具体原因。

    • 从日志入手,查看具体的日志信息
      • 从日志入手的话,那么就需要学会在哗啦哗啦的日志中寻找具体且有用的关键信息,相信大部分同学都用过grep这个命令,相比awk,sed而言,这个命令使用起来更简单,足够满足我们的需求了。推荐grep的几个常用参数:

        -a<显示行数>-a10:处理显示符合结果的那一行外,还显示该行之后的20行
        -b<显示行数>-b10:处理显示符合结果的那一行外,还显示该行之前的20行
        -c<显示行数>-c10:处理显示符合结果的那一行外,还显示该行之前以及之后的20行
        -v “”-v “INFO” 反向匹配。就是匹配到的都不显示,只显示不含有INFO的行。
        -i/–ignore-case忽略字符的大小写
        -egrep -ev “info” -e “error” info.log :相当于or,查看info.log不包含info的行但包含error的行。
        -c统计匹配的行数
        -E正则匹配。使用这个需要了解正则匹配规则。
      • 找到报错信息之后,在源代码中使用全局搜索,找到报错的具体位置,分析报错的具体原因。

    • 再不济,可自己本地调试(当然,这个是在时间相对充分的情况下,如果前面两步还无法找到具体原因的话,可直接交由开发处理)
      • 可以先把bug提给开发,然后自己在本地调试查找具体的问题。如果你仅仅是功能测试,想转测开,这个步骤对自己能力提升也很有帮助。但是如果你只想点点点的话,那这步骤就免了。
    展开全文
  • Bug排查小清单

    2021-01-08 17:28:47
    前言 之前听说过飞机上处理紧急事故是通过故障情况查看...排查Bug也是如此 内容 检索编译器主动报错的内容 数据本身的错误(数据是人编辑的,总会有错) 编译通过的查看是否是自己编写的代码出现问题 持续更新 ...

    前言

    之前听说过飞机上处理紧急事故是通过故障情况查看对应清单,每一种故障都对应一种解决方案,从而使飞行员能够快速做出决策。排查Bug也是如此

    内容

    1. 检索编译器主动报错的内容
    2. 数据本身的错误(数据是人编辑的,总会有错)
    3. 编译通过的查看是否是自己编写的代码出现问题

    持续更新

    展开全文
  • 日常Bug排查-系统失去响应-Redis使用不当 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材^_^。 Bug现场 开发反应线上系统出现失去响应的现象,收到业务告...

    日常Bug排查-系统失去响应-Redis使用不当

    前言

    日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材^_^。

    Bug现场

    开发反应线上系统出现失去响应的现象,收到业务告警已经频繁MarkAndSweep(Full GC)告警。于是找到笔者进行排查。

    看基础监控

    首先呢,当然是看我们的监控了,找到对应失去响应的系统的ip,看下我们的基础监控。

    机器内存持续上升。因为我们是java系统,堆的大小一开始已经设置了最大值。

    --XX:Xms2g -Xmx2g
    

    所以看上去像堆外内存泄露。而FullGC告警只是堆外内存后一些关联堆内对象触发。

    看应用监控

    第二步,当然就是观察我们的应用监控,这边笔者用的是CAT。观察Cat中对应应用的情况,很容易发现,其ActiveThread呈现不正常的现象,竟然达到了5000+多个,同时和内存上升曲线保持一致。

    jstack

    java应用中遇到线程数过多的现象,首先我们考虑的是jstack,jstack出来对应的文件后。我们less一下,发现很多线程卡在下面的代码栈上。

    "Thread-1234
        java.lang.Thread.State: WAITING (parking)
            at sun.misc.Unsafe.park
            ......
            at org.apache.commons.pool2.impl.LinkedBlockingQueue.takeFirst
            ......
            at redis.clients.util.Pool.getResource
    

    很明显的,这个代码栈值得是没有获取连接,从而卡住。至于为什么卡这么长时间而不释放,肯定是由于没设置超时时间。那么是否大部分线程都卡在这里呢,这里我们做一下统计。

    cat jstack.txt | grep 'prio=' | wc -l 
    ======> 5648
    cat jstack.txt | grep 'redis.clients.util.Pool.getResource' 
    ======> 5242
    

    可以看到,一共5648个线程,有5242,也就是92%的线程卡在Redis getResource中。

    看下redis情况

    netstat -anp | grep 6379 
    tcp 0 0 1.2.3.4:111 3.4.5.6:6379 ESTABLISHED
    ......
    

    一共5个,而且连接状态为ESTABLISHED,正常。由此可见他们配置的最大连接数是5(因为别的线程正在得到获取Redis资源)。

    Redis连接泄露

    那么很自然的想到,Redis连接泄露了,即应用获得Redis连接后没有还回去。这种泄露有下面几种可能:
    情况1:

    情况2:

    情况3:
    调用Redis卡住,由于其它机器是好的,故排除这种情况。

    如何区分

    我们做个简单的推理:
    如果是情况1,那么这个RedisConn肯定可以通过内存可达性分析和Thread关联上,而且这个关联关系肯定会关联到某个业务操作实体(例如code stack or 业务bean)。那么我们只要观察其在堆内的关联路线是否和业务相关即可,如果没有任何关联,那么基本断定是情况2了。

    可达性分析

    我们可以通过jmap dump出应用内存,然后通过MAT(Memory Analysis Tool)来进行可达性分析。

    首先找到RedisConn

    将dump文件在MAT中打开,然后运行OQL:

    select * from redis.clients.jedis.Jedis (RedisConn的实体类)
    

    搜索到一堆Jedis类,然后我们执行

    Path To GCRoots->with all references
    

    可以看到如下结果:

    redis.clients.jedis.Jedis
        |->object 
            |->item
                |->first
                    |->...
                        |->java.util.TimerThread
                    |->internalPool
    

    由此可见,我们的连接仅仅被TimerThread和internalPool(Jedis本身的连接池)持有。所以我们可以判断出大概率是情况2,即忘了归还连接。翻看业务代码:

    伪代码
    void lock(){
        conn = jedis.getResource()
        conn.setNx()
        // 结束,此处应该有finally{returnResource()}或者采用RedisTemplate
    }
    

    最后就是很简单的,业务开发在执行setNx操作后,忘了将连接还回去。导致连接泄露。

    如果是情况1如何定位卡住的代码

    到此为止,这个问题时解决了。但是如果是情况1的话,我们又该如何分析下去呢?很简单,我们如果找到了jedis被哪个业务线程拥有,直接从heap dump找到其线程号,然后取Jstack中搜索即可知道其卡住的代码栈。

    jmap:
    redis.clients.jedis.Jedis
        |->Thread-123
    
    jstack:
    
    Thread-123 prio=...
        at xxx.xxx.xxx.blocked
    

    总结

    这是一个很简单的问题,知道套路之后排查起来完全不费事。虽然最后排查出来是个很低级的代码,但是这种分析方法值得借鉴。

    展开全文
  • bug排查流程总结

    2016-08-03 10:37:31
    Ø只会写代码,但不会排查bug的程序员,只能算是业余程序员 Ø能解决一般bug的,只能算是初级程序员 Ø代码写的质量较好,还能查找较难bug的,中级程序员 Ø代码写的质量好,注重性能,不但能排查疑难bug的,还能...

    只要是人写的程序,不可能没有bug,那么解决bug,将伴随程序员的一生:

    Ø只会写代码,但不会排查bug的程序员,只能算是业余程序员

    Ø能解决一般bug的,只能算是初级程序员

    Ø代码写的质量较好,还能查找较难bug的,中级程序员

    Ø代码写的质量好,注重性能,不但能排查疑难bug的,还能解决疑难bug的,高级程序员

    Ø代码写的质量好,注重性能,稳定性,可靠性,架构设计合理,能解决绝大部分疑难问题,属于资深程序员



    以上的话引自某个论坛网站,不一定说的绝对正确,但基本是有道理的。






    面对出现的bug,每个人心态都不一样:






    1.积极主动,从容应对

    自己负责的模块出现bug,不管是自己发现的还是别人发现的,都主动的去查找,搭环境,想办法去解决。






    2.消极被动

    对出现的bug,消极应对,你催我动,不催不动。






    排查流程:








    总结:




    解决bug过程可能痛苦,累人,难受,压力大,甚至暂时还解决不了,关键看是不是尽力了。要想自己得到提高,达到更高层次,这个坎必须跨过,否则只能是平庸的程序员,只能承担一些简单的任务。


    解决bug的过程也能学到很多东西,也有很多乐趣,自己也能得到很大的提升,解决bug是属于自己职责范围内的事情,是种乐趣还是种包袱,关键看个人的心态。


    展开全文
  • 程序的bug排查流程总结

    千次阅读 2015-07-17 14:37:47
    只要是人写的程序,不可能没有bug,那么解决bug,将伴随程序员的一生:Ø 只会写代码,但不会排查bug的程序员,只能算是业余程序员Ø 能解决一般bug的,只能算是初级程序员Ø 代码写的质量较好,还能查找较难bug的,...
  • Golang优化及bug排查

    2021-02-24 14:29:59
    句柄数占用过多 查看是否http客户端等是否忘记close。比如http.Client的defer close在return之后,导致没有关闭就return了。 京城郭少将会持续更新~
  • 前端常用的bug排查工具 1.DebugMe DebugMe可以可视化地跟踪Bug,并可以将代码嵌入到网站的元标记中,来解决跟踪的问题。客户端还可以在网站内保存通过任何类型的Web浏览器访问该网站的评价。DebugMe工具充当Web开发...
  • SimpleDateFormat bug排查

    2015-08-15 23:40:00
    SimpleDateFormat bug排查 :SimpleDateFormat几种使用方式的性能对比,以及线上jvm参数的设置,这应该是学习的态度。 转载于:https://my.oschina.net/lianlupeng/blog/493034
  • java(bug排查流程总结)

    千次阅读 2016-12-12 22:04:42
    Ø只会写代码,但不会排查bug的程序员,只能算是业余程序员 Ø能解决一般bug的,只能算是初级程序员 Ø代码写的质量较好,还能查找较难bug的,中级程序员 Ø代码写的质量好,注重性能,不但能排查疑难bug的,还能解决...
  • java项目线上bug排查

    2019-07-15 23:03:10
    1.收集可供分析的素材(linux系统的指令操作,666为进程号) 监控系统使用情况 top 生成内存dump文件jmap -dump:live,format=b,file=aaa.dump 666 生成线程dump文件 jstack -l 666>...
  • Findbugs工具使用方便,检查java代码bug能力极强,是Java程序员必备的工具之一。
  • 记一次前端bug排查

    2019-05-10 16:04:02
    这周刚加入了一个后台管理系统项目,测试反馈系统刷新时经常会直接登出,严词要求解决这个“重大”bug,so尴尬。 更严重的是发现系统在IE上直接登不进去,婶可忍叔不可忍,于是我开启了苦逼的寻bug之路。 第一次...
  • bug描述: 在阿里云服务器上部署的tomcat服务,tomcat正常启动,未见报错信息,使用http://host:port可访问tomcat服务,但加上服务名无法访问服务,报404错误 排查过程: 由于tomcat控制台未打印错误日志(只有...
  • 文件打开数目过多——bug分析和排查问题描述云平台虚拟机硬盘操作失败排查通过日志排查是文件打开数目过多的原因 利用lsof查看各个进程文件打开数目,发现ProxyServer连接数目达到几千。于是对此进行优化:优化...
  • 但也遇到了很多bug,在此也给出几个常用的命令: 1. scp: /home//information-extraction-master: Permission denied 解决: 用命令: ll 查看读写权限. 再修改文件夹的权限: sudo chmod 7...
  • bug检查工具——FindBugs

    千次阅读 2015-12-07 10:16:37
    Findbugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种Internationalization,12种Malicious...
  • [CSS]图片无法自适应高宽bug排查过程

    千次阅读 2016-11-10 17:09:34
    bug描述 业务代码和以上demo有一点区别: container宽度固定 container高度按内容垂直延伸 按照上面的写法,开始修改我的代码,一切进行的很顺利。然而,当我打开浏览器一看,吓一跳! 大概长这样...
  • php7下的opcache特性导致的一个bug排查

    千次阅读 2015-11-27 17:42:15
    首先这不是opcache的bug,我感觉这算是新特性导致代码不太兼容导致的,因为我们的代码在php5下是跑正常的。 最近在给我们的框架兼容php7,因为框架是扩展的形式,所以得针对新版的zend api修改。一些都OK了,在cli...
  • 但是当别人写的打包工具出了bug时,自己分析问题的能力出了问题,面对输出日志,丝毫没有办法得到有用数据,以至于花费了1个星期左右去查找脚本错误,但是没有丝毫的进展,甚至一度怀疑到别人tinypng API不可靠的...
  • 于是从头开始排查,先检查了查看防火墙端口,也是正常的,排除。 zookeeper,已经启动了,Telnet也能连上,排除 。 最后架构师在和别人说话的时候说了句root启动突然触动了我,赶紧去logs目录检查了下,发现自己...
  • 没有发现任何问题,然后在用java -jar方式中运行时,出现BUG java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 在类似服务器部署环境没法进行debugger的条件下,正好这...
  • # b.py import sys import a func = a.test del sys.modules['a'] # 如果a不重置为None,Python2和3的表现是一致的,所以差异性主要在GC行为上面 a = None func()

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,072
精华内容 104,428
关键字:

bug如何排查