Arthas - Java诊断与调试的瑞士军刀(一)
一、故事的开端,从一个诡异的bug开始
笔者负责了FICC量化金工的项目——情景分析(下文简称为:项目A),其引用了一个公共库fane-lib-java (下文简称为:lib B)。
由于lib B里面防御性编程的缺失,当某个参数异常的传入了null, 导致lib B抛出了NullPointerException, 从而导致项目A计算失败。
(此处补充引用关系架构图)
NPE本身的处理并不复杂,在lib B里加入大量参数校验即可避免。但是紧接着出现了“诡异”的现象:
lib B修改后,本地Windows调试正常。但部署到sit Linux服务器上,依然抛出NPE
笔者逐个尝试了以下可能的解决方法,均无法解决:
- 检查代码,确认cherrypick到指定分支 —— 排除了代码未check in的低级错误
- 重新build代码并部署 —— 排除build的不是最新代码
- 在sit服务器上,反编译lib B的jar包,确认修改的代码进入了jar包 —— 排除了sit 服务器使用的是旧代码
在“已确认代码修改进入了jar”后,代码修改依旧不生效, 让笔者百思不得其解...
二、故事的中段,嗅到bug的方向
尝试多种常规解决方法后,NPE异常依然存在,说明此bug非常的不常规...
并不再是代码层面导致的,而是“操作系统”、“硬件机器”等非代码因素造成的。
笔者再次尝试了做了以下操作:
- 在同事的本地windows机器上运行,一切正常 —— 再次排除代码的问题
- 尝试部署到另一台sit Linux服务器,依然不工作 —— 此时已经嗅到了bug的方向
通过上述两个操作,可以察觉,异常bug的造成极有可能
三、大杀器Arthas登场