线上代码不符合预期?不妨试一下反编译

背景

本周上线发布了一个小功能,功能很小,就是增加了一个if判断,可以简单理解为下面的情况。

private static final String PREFIX = "xxx";

private boolean valid(String input) {
   // 原有逻辑不变
   if (input.startsWith("xxx")) {
      return false;
   }
   return true;
}

这段代码相当简单,但是线上运行时,偶尔会发现返回不符合预期。

排查

阶段1:根据日志获取到对应的实际数据,通过main函数方式运行,发现符合预期,代码本身没有问题。
阶段2:分析不符合预期发生的时间,该代码位于一个定时scheduler job中,任务每2分钟执行一次,但是发生问题的时间点并非连续,应用部署在4台机器上,怀疑和某台机器有关系。
阶段3:查看当天上线操作流程,应用原有3台机器,当天正常部署发布了最新代码。部署以后,为提升应用处理性能,做了一个机器扩容,增加到4台机器,所以当天增加的这台机器可能就是问题所在,有可能代码不是最新的。
阶段4:验证猜测。
step1. 登录机器,获取到部署的jar包,解压后获取到对应的class文件。

unzip xxx.jar

step2.反编译class文件。
如果可以下载文件到本地,那么可以利用图形化的工具jad-gui方式,或者直接拖入intellij IDEA。
如果在linux机器上,可以借助jad命令,该程序需要安装。
当然,还有java自带的命令javap,也可以用于反编译,关于javap命令参考:

通过示例代码,可以运行下面的命令,查看当前class文件中是否有对应的private static final String PREFIX变量声明。

javap -private xxx.class

阶段5: 重新部署解决,怀疑该问题还是由于部署和扩容同时进行,可能导致扩容的时候还是部署的旧代码导致的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

51iwowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值