Arthas - Java诊断与调试的瑞士军刀(一)

frank_cui / 2024-02-23 / 原文

 

一、故事的开端,从一个诡异的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登场