You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
表现现象: 宿主应用为: 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方式的时候这里已经加载起来了,所以报错了。
表现现象: 宿主应用为: 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,所以不会报错。
The text was updated successfully, but these errors were encountered: