得亏了它,我才把潜藏那么深的Bug挖出来

2024-03-23 15:20
文章标签 bug 亏了 潜藏 挖出来

本文主要是介绍得亏了它,我才把潜藏那么深的Bug挖出来,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2020 年写了很多事故解决的文章,并不是我绞尽脑汁想出来的,而是真的遇到了这些问题。通过文章的方式记录下来,分享出去,才有意义。

事故背景

首先看下面的图吧,这是我从 cat 上截的图。


可以看到是一个 Rpc 调用的错误,从错误中我们只能分析出这个 Rpc 的请求成功了,并且返回了,因为都走到了反序列化这步。

最后是在创建 DTO 对象的时候报错了,Could not initalize class xxxxx.DTO说明了这一点。

作为一个调用方,虽然看到了明确的错误,但还是要本着严谨的态度去排查问题,还是先确认服务提供者到底有没有问题,跟同事确认了,服务提供方没问题,通过 telnet 可以正常 invoke。

好了,到这为止就把背景交代清楚了,能不能将这个潜藏的 Bug 找出来就各显身手吧。

arthas 大显身手

要想效率高,那必须得有好用的工具呀!arthas 挺身而出,都毛遂自荐了,不用白不用。

首先使用 sc 命令查看 JVM 已加载的类信息,就看这个不能实列化的类到底有没有被成功加载。

sc -d 类全路径 (打印类的详细信息


类的信息都被打印出来了,足以证明这个类被加载了。

然后打印下类里面的字段,看看有没有丢失什么的

sc -d -f 类全路径 (打印类的Field信息


居然报错了,错误还跟我们之前在 cat 中看到的一模一样,这边也是要是创建对象,然后反射获取所有字段信息,由于不能创建对象,直接报错了。

就这么结束了吗?怎么可能,还没下班呢,接着走下去。。。。

现在我开始怀疑这个 class 是不是有问题,然后就开始用 arthas 的另一个命令 jad 来反编译。

通过 jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于我们理解业务逻辑,也能让我们知道代码跟本地的到底是不是一致。

jad --source-only 类全路径

执行完后,什么也没输出,我一度怀疑这个命令是不是我用错了,然后我试了下 jad --source-only java.lang.String 发现命令没问题,就是那个 class 有问题。

这时我想起还有一个 redefine 命令可以用于加载外部的.class 文件,看看能不能加载进来。于是我将 lib 目录里面依赖的 jar 包解压了,然后用 redefine 去加载那个不能反编译的 class。


居然告诉我是一个无效的 class,尝试多次都无法让这个 class 现出庐山真面目。

最后没办法,只能将这个 class 弄到本地,拖入 IDEA 中反编译,对比了下代码,跟 git 仓库里面的一模一样,也就不存在 jar 包损坏的问题。

即将揭开真相

到目前为止,有效的线索如下:

  • class 已加载,但是无法实例化

  • 通过本地反编译,代码是完整的

越在这种没有思路的情况下越要静下心来思考,于是再次看了一遍源码,发现这个类中有引用一个外部的自定义异常类。

然后我用 sc -d 去查看这个类的信息,告诉我不存在,终于明白了。


看上面这张图,项目 A 依赖了 API,API 中依赖了 Common,Common 中又依赖了很多其他的三方 Jar 包。

由于项目 A 和 Common 中依赖的三方 Jar 包冲突了,所以项目 A 中之前就简单粗暴的把 Common 给排除了,冲突是解决了。

在进行 RPC 调用的时候,请求的数据响应回来后需要反序列化成对象,这个时候去创建对象失败了,因为类中依赖了某个外部的类,但在当前项目中没有加载进来,所以就报错了。

总结

这次的问题归根到底还是没有想到一个 API 会依赖其他的模块,本身 API 作为 RPC 调用客户端就应该简洁。

其实在做 exclusion 的时候应该只 exclusion 有冲突的三方 Jar,不应该将整个 Common 都 exclusion 掉。

最后就是合理的利用方便快速的工具帮助我们快速的排查问题,arthas 就是这个好帮手,通过 arthas 我们可以进一步排除程序启动后加载的 class 有没有问题,进一步缩小范围。

技术交流可以扫下面图片加我微信。

热文推荐

惊讶!缓存刚Put再Get居然获取不到?

好机会,我要帮女同事解决Maven冲突问题

上线前一个小时,dubbo这个问题可把我折腾惨了

为了控制Bean的加载我使出了这些杀手锏

如有收获,点个在看,诚挚感谢

这篇关于得亏了它,我才把潜藏那么深的Bug挖出来的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838735

相关文章

JavaBug系列-解决SpringBoot返回Xml结构的问题

JavaBug系列之SpringBoot返回Xml结构的问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 作者:Java医生 教学: Java企业项目辅导,专注于辅导新入职员工,解决各种问题! V:study_51ctofx 一、关于错误信息 如图,SpringBoot请求返回Xml格式信息 通过以上信息分析,

JavaBug系列- Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class load

JavaBug系列之Mysql驱动问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 Java/一对一零基础辅导/企业项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 V:study_51ctofx 一、关于错误信息 APPLICATION FAILED TO START Description: Fai

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考:又报gyp ERR!为什么有那么多人被node-sass 坑过? 主要有如下三方面错误,请自查: 1.node,npm版本需与node-sass版本匹配,像node-sass(^4.14.1)就得node 14.x版本才可以,node 16不行 gyp ERR! build error15 gyp ERR! stack Error: `

排查 MyBatis XML 配置中的 IF 语句与传值名称不匹配的 Bug

文章目录 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,在改一个bug得时候发现一个有意思得问题,就是mybatis得xml中if判断得问题,传值名字不匹配依旧可以进行判断,如下图 传值userName,但是有意思得事情出现了,进了if,并且没有报错,尝试了两次都是这

彻底解决魅族手机无法彻底卸载应用的bug

使用Flyme系统的同学可能会遇到一个问题: 卸载了某些软件(例如通过开发者模式调试安装的应用)后,实际这个应用还残留在系统,当你用低版本或者其他签名的apk覆盖安装的时候会提示“安装失败”,要求你卸载后重新安装。 可是无论你从应用列表寻找还是清理垃圾,都根本找不到这个应用。 闹鬼?这个bug一直伴随着flyme,可怜工程师们竟然一个都没发现。 今天笔者教大家一招解决这个问题。

今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题

结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xxx一致Map<String,String> dataMap = new HashMap<String,String>();dataMap.put("username", "张三");dataMap.

【软件测试】软件测试-----什么是Bug?Bug是如何分级的?Bug的生命周期是怎样的?如何描述一个Bug?

博客目录 一.软件测试的生命周期二.BUG的定义和级别2.1 bug的概念.2.2 如何描述一个bug.2.3bug的级别2.3.1 bug分级的意义.2.3.2 bug的四种级别. 三.BUG的生命周期.四.当与开发人员发生冲突该如何处理(高频面试)五.总结 一.软件测试的生命周期 软件测试贯穿于软件的整个生命周期,针对这句话我们一起来看一下软件测试是如何贯穿软件的整个生命周

【ListView】有关填充bug

假设要实现如下效果 ListView里若使用RelativeLayot则会出现错误 得不到垂直线的填充 线性布局的高度设置为match_parent会使高度为0,必须给它一个固定值,比如20dp ListView建议使用LinearLayout在最外层,而最外层的宽高无论如何设置都无法确定的,建议第二层也使用linearLayout来布局 【实现

ListView数据只有显示不全bug

Android编程中,ScrollView嵌套ListView时,会无法正确的计算ListView的大小。解决的办法有如下两种: 解决方案1: 直接把包含ListView控件的ScrollView控件从布局文件中去除,留下ListView控件,这是最简单快捷的解决办法,如果一定要在ScrollView中包含ListView,则参考解决方案2:

ScrollView嵌套listview滑动位置底部bug

三种方案,个人推荐第三种: 1 sv.fullScroll(ScrollView.FOCUS_UP); 2 sv.setScrollY(0); 3 sv.smoothScrollTo(0,20); 滑动冲突解决listView: public class ListViewForScrollView extends ListView {public ListVie