debug记录--从【点不动按钮】到【证书过期】


耗时两天半解决了一个bug,记录一下

问题描述

测试反馈app上的一个模块点不动

排查过程

  1. 和前面的一个版本对比了下,发现旧版本没有此问题,新版本有此问题。由此怀疑是客户端问题,于是怀疑是自己合并代码的时候,把原有逻辑搞坏了。
  2. 由于和上个版本之间隔了很多commit,中间还有好几个GitMerge,感觉不太好对比两个版本之间的差异,所以决定真机复现一下,看看到底是什么原因。
  3. 真机调试的机器超级慢,最终找到了代码层面的原因: javax.net.ssl.SSLHandshakeException: Chain validation failed。这里多提一句,catch到异常的时候写了e.printStackTrace(),屁用没有,应该用Log把异常message打印出来,这样的话看日志比真机debug快多了。
  4. 再说回上面的异常信息,搜了下可能是证书过期导致的。
  5. 于是联系运维,坐等证书更新就OK了。然而,等他说证书更新了之后,我发现APP里面还是老样子。在浏览器访问该域名发现有时候显示证书有效,有时候显示证书过期。
  6. 这下没思路了,又怀疑是客户端问题,但是我找不到具体的解决思路。只能和上个版本对比,看看是哪个commit导致的。使用二分法找,打了很多个包之后终于找到了出现问题的commit。和提交者沟通后,发现上个版本发起请求的时候压根没走SSL校验,所以证书过期了也不会去校验证书链,也就没有问题。那么应该不是客户端的问题了。
  7. 又怀疑是证书的问题,因为我有时候能在浏览器看到证书还是处于过期的状态。
  8. 经过我在不同的浏览器多次尝试访问该域名,每次都清理浏览器缓存,终于发现了可能的原因:目标域名DNS解析后有三个IP,通过在浏览器访问IP,我发现只有一个IP的证书更新了,其他两个IP的证书都还是过期状态。沟通了运维,让他去处理,等到那边处理结束,我在APP上多次测试,都没发现问题。终于解决。

总结

  1. catch异常的时候,应该用Log记录异常信息。
  2. 这次debug涉及到了网络相关的知识,挺感兴趣的,所以对于debug时间没太在意,想探究下。
  3. DNS缓存太多了,浏览器有,host有,DNS服务器也有。