记录一下我的排查问题过程实例
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问题排查