年年出妖事,一例由JSON解析导致的“薛定谔BUG“排查过程记录

本文详细记录了一个由fastjson解析错误引发的罕见bug,该bug表现为在特定条件下偶发,且在debug模式下消失。经过排查发现,bug源于fastjson早期版本对泛型解析的不严谨,即相同对象的前一次泛型定义会被缓存。通过升级fastjson到1.2.33及以上版本,成功解决了这个问题。文章强调了探究bug根源的重要性,而非仅依赖于升级或替换库。
摘要由CSDN通过智能技术生成

前言

做开发这么多年,也碰到无数的bug了。不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因。

但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我甚至是百思不得其解。在长达几天的时间内,复现的概率非常低。几乎难以抓住任何踪迹。

所以这篇文章就非常写实的来记录一下此Bug的发现和排查整个过程。

起因

同事之前做了个需求,提交测试。测试同事在测的一半的时候。发现了后台的一个报错

com.alibaba.fastjson.JSONException: can not cast to String, value : {"code":"00","msg":"成功","data":{这里是正确的数据}}
 at com.alibaba.fastjson.util.TypeUtils.castToInt(TypeUtils.java:564) ~[fastjson-1.2.29.jar:na]
 at com.alibaba.fastjson.serializer.IntegerCodec.deserialze(IntegerCodec.java:89) ~[fastjson-1.2.29.jar:na]

一看就知道这错很简单,就是一个fastjson的转换类型的报错。接受的json和要转化的类型不匹配造成的。基本上检查下代码,一眼就能解决的。

结果同事看了好一会儿,都没发现哪有问题。

然后远程在测试环境debug运行,打上断点准备调试,测试同事操作下来,却又好了。

然后释放断点,正常运行。操作一会,又出现了相同报错。

继续打上断点,还是正常。

这个现象把同事整的有点懵,我在群里看到这个,觉得这个现象很有趣,结果竟然依赖于是否观测,这什么鬼。。

我接过手看了下代码,我初步看下来也是完全没问题的。

代码我经过了精简和一些伪代码处理,如下所示:

public <T> T executeLua(String luaName, Class<T> c, Object... args){
 String json = 执行器.执行(luaName,args);
  log.info("执行结果为:{}",json);
  T resut = JSON.parseObject(json
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值