记录一下我的排查问题过程实例

其实实习这么久,花最多时间还是在排查自己代码出的问题上面去。

其实也没有什么统一的方法,我自己也不喜欢断点调试。

总结一点:认真看报错和日志!然后一层一层寻找问题所在。

感觉就像在玩侦探破案游戏一样,找到了问题并且解决是很有成就感的(我并不是QA哈哈)

记录一下自己出的bug

1、数据库

感觉数据库的问题,报错都挺明显的,只不过很长,注意看就行了。

{
   "isError": true,
   "message": "\n### Error updating database.  Cause: java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1\n### The error may involve defaultParameterMap\n### The error occurred while setting parameters\n### SQL: INSERT INTO t_appoint(mis_id,serial_number,appoint_time,slave) VALUES (?,?,?,?)\n### Cause: java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1\n; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1; nested exception is java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1",
   "data": null
}

一开始以为test08有什么问题,但是仔细看,发现是“ Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1”

意思是slave的属性是int的,但是你插入了一个test08字符串。所以我们只要去数据库把slave的属性改了就好。

2、服务器没有返回数据。

服务器没有返回数据(正常情况下,出错or正常都会返回数据的),但是前端200啊。怎么回事呢?

看服务器的logger,根本没有打印出这次访问。(如果有请求,服务器无论接受与否,都会打印这次访问的info)。

那就有一个猜想:被拦截器拦截下来了。

怎么回事呢?这就要靠自己去仔细阅读项目里面前辈们写的拦截器代码了。spring下都是继承HandlerInterceptorAdapter类再自己实现的。

我的请求路径是/appoint/xxxxxxx

以下是拦截器代码。

阅读的过程和思考写在了注释里面

     String method = request.getMethod().toUpperCase();
    //我的请求是post方法,所以这个filter肯定是false
        boolean filter = "GET".equals(method) || "HEAD".equals(method) || "OPTIONS".equals(method);

        String uri = request.getRequestURI();

        uri = URLDecoder.decode(uri, URI_CHARSET);

        User user = userService.getCurrentUser();
        String name = null;
       //我自己的路径在配置里面是不用走登陆的,所以用户肯定是null,这部分跳过即可。
        if (user != null) {
            ......
        }

        if (name != null && !uri.startsWith("/static/")) {
            ......
        }

    //上面说了filter是false,这里可以跳过了
        if (filter) {
            return super.preHandle(request, response, handler);//true
        }

    //只有这个可能了,仔细看,我的请求开头是appoint,所以进到第二个if
        if (uri.startsWith("/ba/")) {
            return checkBaseAuth(request, response);
        } else if (uri.startsWith("/ci/") || uri.startsWith("/safety/") || uri.startsWith("/api/") || uri.startsWith("/appoint/")) {
            return checkLAN(request);//跳到这里
        } else {
            return checkXSRF(request, user);
        }

  

//这个函数是拦截ip,看看请求的ip,在不在非拦截的ip里面。非拦截表在下面。private boolean checkLAN(HttpServletRequest request) {
        String host = request.getRemoteHost();

        for (String ip : EXCLUDE_IP) {
            if (host.startsWith(ip)) {
                return true;
            }
        }

//我起的是本地服务。localhost:8080/appoint/xxxxx,而127.0.0.1也在不拦截的名单里面。
private static final String[] EXCLUDE_IP = {        "127.0.0.1", "211.151.229.", "58.83.134.", "58.83.142.",        "106.3.46.", "221.194.", "106.120.108.44", "172.24.35.16"};

  

我就纳闷了!一路走下来没事啊。为什么会被拦截了呢?

于是我不信邪,加了一句打印日志,看看自己ip。

sLogger.info("host ip : {} ", host);

发现

好了,知道问题所在了。

localhost 解析为ipv4地址是127.0.0.1,解析为ipv6的时候,就是上面的0:0·······1。而0:0········1不在我们的不拦截表里面,所以被拦截下来了。

真是莫名其妙的问题啊??

时间: 2024-10-09 04:15:52

记录一下我的排查问题过程实例的相关文章

MySQL redo lock 死锁问题排查 & 解决过程

版权声明:本文由 MySQL redo lock 死锁问题排查 & 解决过程 张青林 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/181 来源:腾云阁 https://www.qcloud.com/community 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪

Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助. 死锁案发还原 表结构: CREATE TABLE `song_rank` ( `id` int(11) NOT NULL AUTO_INCREMENT, `songId` int(11) NOT NULL, `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`

记录一次抽奖超发排查问题过程

接到运营方提出的bug,说是移动端优惠券超发,通过拉取线上数据,确实存在超发现象,而且恰好是设定的两倍. 通过在测试和仿真环境新建一个活动页面添加优惠券进行测试,又不会出现超发现象,想到可能是并发没控制好,找代码问题,根据逻辑下来没什么问题,微调redis缓存控制并发策略,提测上线. 上线后第二天接到运营反馈,还是存在超发现象,而且仅仅是移动端超发,PC端不会超发,在测试仿真模拟领取,用测试工具模拟并发,都不会出现超发现象.到这没办法解决了,直接报告领导存在这样的问题,没招了,怎么办? 领导询问

从零开始的MYSQL02 --- MySQL启动方式及故障排查,多实例搭建

1. MySQL的方式及区别     在MySQL启动遇到故障怎么排查 /etc/init/d/mysql start | restart | stop 这个脚本是一般安装后由mysql.server 自动生成,如果是直接解压使用的需要手动添加. 设置mysql自动启动:chkconfig mysql on,如果线上库,我建议关闭自动启动,线上库本着一个原则,出错了就停下来.或者脚本来控制批量的启动与停止. /etc/init.d/mysql  ( mysql.server) /usr/loca

记录一个前端bug的解决过程

人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下生理特征: 后台日志能统计到异常,偶发.低频 报异常的用户设备不具有规律性,什么手机都有 我们自己无法复现,任何设备.任何环境都没复现 打电话回访报异常的用户,确实存在问题 客服未接到用户主动反馈这个异常 此bug并不是js报错,而是一个业务逻辑的错误.表现是,用户提交的数据莫名缺失.场景是以下这个

记录一次redis数据库搭建过程并详细说明配置

redis.conf配置文件详解 Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程daemonize no 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定pidfile /var/run/redis.pid 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女

一个非常罕见的SQLServer镜像异常的排查处理过程

本周一晚上,收到一个数据库镜像SUSPEND和SYNCHRONIZING状态来回切换的告警,看到这个错误,其实也蛮常见的. 我们的修复步骤一般是这样的: 1. ALTER DATABASE *** SET PARTNER RESUME 如果这个步骤还不行,就需要触发一个事务,因为偶尔我们遇到SYNCHRONIZING状态的,可以触发事务修复,其原因可能是镜像由于网络原因冰了一下 2. CREATE TABLE dbo.tb_repair_mirroring_****(ID int), 然后删除该

记一次AD域域管理员密码更改导致某系统群集管理器故障排查解决过程

环境描述 某公司有一套系统,2台Windows2003系统,采用自带的群集管理器功能实现双机热备功能,正常情况下,服务器10.1.1.1承载中间件应用服务,服务器10.1.1.2承载数据库服务,仅当其中一台服务器故障时才会把资源切换至另一台. 系统名称 系统版本 IP地址 备注 S-EIP-APP Windows2003ENTSP2 10.1.1.1 采用Windows2003自带的群集管理器实现双机热备功能 S-EIP-DATA Windows2003ENTSP2 10.1.1.2 故障表现

记一次删除Git记录中的大文件的过程

app/test/target/ #查看大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" #删除大文件或者目录 git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch app/