IT教程 ·

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

利用matplotlib进行数据可视化

2020年写了许多变乱处理的文章,并非我挖空心思想出来的,而是真的遇到了这些问题。经由过程文章的体式格局记录下来,分享出去,才有意义。

变乱背景

起首看下面的图吧,这是我从cat上截的图。
得亏了它,我才把潜藏那么深的Bug挖出来 IT教程 第1张

能够看到是一个Rpc挪用的毛病,从毛病中我们只能分析出这个Rpc的要求胜利了,而且返回了,因为都走到了反序列化这步。

末了是在建立DTO对象的时刻报错了,Could not initalize class xxxxx.DTO说清晰明了这一点。

作为一个挪用方,虽然看到了邃晓的毛病,但照样要本着严谨的立场去排查问题,照样先确认效劳提供者究竟有无问题,跟同事确认了,效劳提供方没问题,经由过程telnet能够一般invoke。

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

arthas大显神通

要想效率高,那必需得有好用的东西呀!arthas自告奋勇,都自我介绍了,不用白不用。

起首运用sc敕令检察JVM已加载的类信息,就看这个不能实列化的类究竟有无被胜利加载。

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

得亏了它,我才把潜藏那么深的Bug挖出来 IT教程 第2张

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

然后打印下类内里的字段,看看有无丧失什么的

sc -d -f 类全途径 (打印出类的Field信息)

得亏了它,我才把潜藏那么深的Bug挖出来 IT教程 第3张

竟然报错了,毛病还跟我们之前在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。

得亏了它,我才把潜藏那么深的Bug挖出来 IT教程 第4张

竟然告诉我是一个无效的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有无问题,进一步减少局限。

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)

参与评论