Bug定位思路
- 用户操作外部环境条件
网络设了代理、弱网(如js/css未加载完全、请求超时)浏览器不支持、系统版本不支持、数据库被删除、测试环境脏数据、项目配置开关、测试环境切了分支等 - 界面UI
css样式问题 js交互问题 html文本问题 - 中间环节
缓存服务器(如redis)消息中间件(如rabbitMQ)、数据存取中间件(如七牛*)
表单上传本地图片到七牛,提交表单后查看详情 七牛处理后给的图片链接带图片名称,如图片名称有中文会编码格式冲突导致图片加载失败 - 后端服务
如nginx配置、tomcat版本不同、jar包版本测试环境和正式环境不同 - 数据库
如测试环境和正式环境数据库版本不同、前后端数据格式*、长度限制不同
定位方式及案例
- 常见的可根据具体操作路径、查埋点、查后台配置、查数据库落库数据等来定位用户操作失误、项目配置不对等
- 抓包(fiddler、Charles、wireshark等,web端可开启F12调试*)
-
看前端请求参数、content-type、token、格式等
如NPS
image.png
-
看返回状态码
400 bad request 参数有误、语义有误; 401 unauthorized 需用户信息验证;403 forbidden 服务器拒绝访问;404 not found资源未找到;405 method not allowed,如put delete
500 服务器无法处理,一般服务端内部错误 如源码错误
501 not implemented 服务端不支持请求的功能,无法识别请求方法
502 bad gateway 网关或代理从上游收到无效相应
503 service unvailable 服务临时维护或过载当前无法处理请求,
504 gateway timeout 网关或代理从上游未及时收到相应
505 http版本不支持
image.png
- 返回内容体
排查接口返回数据的时候出错了,还是数据库中的数据就错了,还是缓存中的数据错了(如果用到了缓存的话)
1)如返回数据只有错误码,没有reason或者没有明确的错误原因时,还可以根据请求接口调用哪个方法,去方法里面查错误码代表什么意思。方法里包含对哪个数据库表的什么操作,拿对应的条件去数据库里面查,数据库里的数据是否存错了或是被修改了或是脏数据或是数据迁移后出的问题
2)数据返回精度的问题,如金额方面四舍五入还是直接截断,前后端对各部分的数据组成处理方式是否一致,后端的数据计算逻辑,数据库和金额相关的字段的存储数据是否正确,前端直接拿后端返回的数据还是前端自己计算的
3)接口返回正常,客户端展示没更新,则考虑前端刷新机制是否有问题
抓包请求和返回内容可以结合接口文档来看,是否按约定格式请求和返回,各字段数字表示的含义,有些返回状态码会根据业务对其进行二次包装
服务端因用户认证服务升级后没做处理存入es字段错误.png
-
看日志
1)服务端日志
命令行ssh/xshell工具登录到服务器,找到相应log日志所在的目录实时查看日志 tail -f xx.log 或 cat xx.log |grep '关键词' 如找到报错信息可以去代码里面查是哪块报错
image.png
ps:分享一个我建表时设置了一列not null 没设置默认值
在 insert into表其他列赋值了这一列没赋值,报错了 Field 'name' doesn't have a default value
解决方法就是加一个DEFAULT ''
此外建表时id也注意加AUTO_INCREMENT
2)客户端
<1> crash 以android端设备为例,一般,我们使用adb命令,输入adb logcat>log.txt会抓到系统的log。
搜索Fatal,Exception等关键字,找到报错的log的堆栈,给到开发。开发根据堆栈可以看到是具体的哪行代码报出来的错误。
<2>ANR 执行adb pull /data/anr/anr_2019-08-30-14-24-52-903 <本地目录>,需要注意的是,取/data/anr/目录下的文件,是需要root权限的
7.0及以上设备 adb bugreport bugreport.zip 从生产的bugreport中,搜索ANR关键字
<3>ios端 连接手机打开xcode,从菜单栏上选择 【Window】 菜单, 然后选择【 Devices】 .在窗口上, 选中对应的设备后,点击 【View Device logs】 按钮
或使用 itools:高级功能-》崩溃日志
另外可以排查上一版本是否有该问题出现。方便开发定位是遗留下来的问题还是更新代码合入引进来的新问题
网友评论