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

Posted wzb的QQ空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一下我的排查问题过程实例相关的知识,希望对你有一定的参考价值。

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

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

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

感觉就像在玩侦探破案游戏一样,找到了问题并且解决是很有成就感的(我并不是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", 省略
};

  

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

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

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

 

发现 

好了,知道问题所在了。

 

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

 

真是莫名其妙的问题啊

以上是关于记录一下我的排查问题过程实例的主要内容,如果未能解决你的问题,请参考以下文章

记录一将内存中大量JceSecurity实例导致OOM问题排查

记录一将内存中大量JceSecurity实例导致OOM问题排查

一个C++工程CPU占用100%问题的排查

一个C++工程CPU占用100%问题的排查

记录一次@Cacheable导致死锁问题排查过程

记录一次@Cacheable导致死锁问题排查过程