表现现象: 宿主应用为: logback + slf4j版本(1.7.12),对logback里的Logger.java进行增强,agent测试可以,但是attach方式不生效。打开debug日志发现是抛异常了。
2019-07-29 16:54:10 sunfire DEBUG remove from findForReTransform, because loading class:ch.qos.logback.classic.Logger occur an exception
com.alibaba.jvm.sandbox.core.util.UnCaughtException: java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
at com.alibaba.jvm.sandbox.core.util.LazyGet.get(LazyGet.java:27)
at com.alibaba.jvm.sandbox.core.util.matcher.structure.ClassStructureImplByJDK.getBehaviorStructures(ClassStructureImplByJDK.java:240)
at com.alibaba.jvm.sandbox.core.util.matcher.ExtFilterMatcher.matching(ExtFilterMatcher.java:89)
at com.alibaba.jvm.sandbox.core.util.matcher.GroupMatcher$Or.matching(GroupMatcher.java:30)
at com.alibaba.jvm.sandbox.core.util.matcher.GroupMatcher$And.matching(GroupMatcher.java:52)
原因分析:
DefaultModuleEventWatcher的watch方法里有一句, final List<Class<?>> waitingReTransformClasses = classDataSource.findForReTransform(matcher);
方法,这个方法是会反射拿到waitingReTransformClasses的方法结构,由于slf4j的类不存在,所以报错了。
由于agent启动方式的时候,宿主的logback还未加载起来,所以这里不会报错。而attach方式的时候这里已经加载起来了,所以报错了。
接着,agent的方式,在宿主的classloader的logback第一次被加载的时候,触发了SandboxClassFileTransformer,走入了正常的流程,所以正常加载。而attach模式因为这个类已经被加载过了,而reTransformer的时候抛异常了,所以永远不会再被加载了。
注意的是,agent的方式,classBeingRedefined = null, 所以这里拿结构使用的是ClassStructureImplByAsm,所以不会报错。
表现现象: 宿主应用为: logback + slf4j版本(1.7.12),对logback里的Logger.java进行增强,agent测试可以,但是attach方式不生效。打开debug日志发现是抛异常了。
2019-07-29 16:54:10 sunfire DEBUG remove from findForReTransform, because loading class:ch.qos.logback.classic.Logger occur an exception
com.alibaba.jvm.sandbox.core.util.UnCaughtException: java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
at com.alibaba.jvm.sandbox.core.util.LazyGet.get(LazyGet.java:27)
at com.alibaba.jvm.sandbox.core.util.matcher.structure.ClassStructureImplByJDK.getBehaviorStructures(ClassStructureImplByJDK.java:240)
at com.alibaba.jvm.sandbox.core.util.matcher.ExtFilterMatcher.matching(ExtFilterMatcher.java:89)
at com.alibaba.jvm.sandbox.core.util.matcher.GroupMatcher$Or.matching(GroupMatcher.java:30)
at com.alibaba.jvm.sandbox.core.util.matcher.GroupMatcher$And.matching(GroupMatcher.java:52)
原因分析:
DefaultModuleEventWatcher的watch方法里有一句, final List<Class<?>> waitingReTransformClasses = classDataSource.findForReTransform(matcher);
方法,这个方法是会反射拿到waitingReTransformClasses的方法结构,由于slf4j的类不存在,所以报错了。
由于agent启动方式的时候,宿主的logback还未加载起来,所以这里不会报错。而attach方式的时候这里已经加载起来了,所以报错了。
接着,agent的方式,在宿主的classloader的logback第一次被加载的时候,触发了SandboxClassFileTransformer,走入了正常的流程,所以正常加载。而attach模式因为这个类已经被加载过了,而reTransformer的时候抛异常了,所以永远不会再被加载了。
注意的是,agent的方式,classBeingRedefined = null, 所以这里拿结构使用的是ClassStructureImplByAsm,所以不会报错。