#Java #BUG #异常

# 起因

大概是组里人手不够吧,反正就是把我拉去排查一个 N 多年前的项目的 bug,听描述就是微信公众号推送消息的代码有问题,不过之前没对接过,说实话还不知道具体流程,死马当活马医了。

# BUG1

先进服务器看下日志,直接就看到一个形如栈溢出的异常,不过最后抛出的不是 StackOverflow,好像是空指针之类的异常,于是把代码拉下来看了眼,果不其然

只能说这写的是真的神秘,咱也不知道当时到底是什么需求,会导致这样的代码,听说这 jsticket 反正也不用了,干脆就给注释了。
然后跑了一下发现还是不通,于是就去试了下 api,结果发现限额用光了,换了个 key,bug1 解决。

# BUG2

刚解决完一个 bug,又告诉我登录跳转有问题,这次查日志,就发现一个 Authentication Failed! 还是别家公司的 sdk 里提示的,根据 exception 信息里的代码行数去找了下源码,结果发现异常没做日志,而是使用 pringStackTrace () 直接打印了,结果不管是日志还是错误页面都没有

try {  
   // OAuth2 认证  
} catch (Exception e) {  
   e.printStackTrace();  
   throw new Exception("Authentication Failed");  
}

同时我也很好奇为什么 e.pringStackTrace 为什么打印不到日志中,于是看了下源码

public void printStackTrace() {  
    printStackTrace(System.err);  
}  
  
 
 */public void printStackTrace(PrintStream s) {  
    printStackTrace(new WrappedPrintStream(s));  
}

看到上面的 System.err 就知道了, Typically this stream corresponds to display output or another output destination specified by the host environment or user. 一般这个流会输出到屏幕上,也就是控制台,或者用户定义的其他输出流。而刚才查看的 log 又是使用日志框架记录的,自然不会记录到 stderr 的内容。
于是又上去找其他日志,发现同目录下面还有个 tomcat-stderr.logs 的文件,打开来后果然发现有真正的报错信息

InvalidClaimException: The Token can't be used before xxx

大致意思是 token 不能在某个时间点之前使用,然后看了下时间,发现服务器上的时间居然和真实时间错了 3 个小时。。。同步回正常时间后,成功运行。