异常场景描述
最近在学习ASM字节码插桩时,使用JavaAgent命令-javaagent:
侵入服务,启动服务时,出现如下报错,错误堆栈如下:
java.lang.IncompatibleClassChangeError: org/itstack/sqm/asm/probe/ProfilingClassAdapter
at org.itstack.sqm.asm.probe.ProfilingTransformer.getBytes(ProfilingTransformer.java:78)
at org.itstack.sqm.asm.probe.ProfilingTransformer.transform(ProfilingTransformer.java:37)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredClasses0(Native Method)
at java.lang.Class.getDeclaredClasses(Class.java:1867)
at java.lang.Class$2.run(Class.java:1504)
at java.lang.Class$2.run(Class.java:1499)
at java.security.AccessController.doPrivileged(Native Method)
at java.lang.Class.getClasses(Class.java:1498)
at ...
排查原因
IncompatibleClassChangeError是一种ERROR,并不是由ASM所引起,这是一种通常的错误。可能的原因如下:
- 在项目中对已编译的类进行了修改,而没有重新编译所有依赖这些类的其他类。
- 类的结构发生了改变,如将一个类从普通类修改为接口或反之,但编译器未能检测到这些变化。
- 使用了不同版本的库,其中的类结构有所不同,导致在运行时出现冲突。
我的使用场景是使用JavaAgent和ASM来侵入服务中,并没有修改服务的代码,所以更可能是第三种原因。
于是check了一下自己写的JavaAgent和服务中的依赖diff:
看到原服务中也依赖了asm,但是版本是4.x,太低了,而且与我使用的asm版本冲突:

解决方案
依赖冲突可以在启动命令中添加-cp
选项进行依赖替换,具体为:

在Maven中下载需要的asm版本依赖jar包,手动上传jar包,并更改服务的启动脚本,将自定义的jar包替换旧的jar包,重新启动服务。
启动成功,成功监控到目标类和方法。

补一个ASM与JAVA版本之间的对应关系:https://blog.csdn.net/mldxs/article/details/143055666