-
Bug
-
Resolution: Won't Do
-
Blocker
-
None
-
4.0.4, 4.0.5
-
None
I have the following Byteman rule that instruments the ClassLoader class:
RULE OpenTracing SpecialAgent ClassLoader Injection CLASS ^java.lang.ClassLoader METHOD Class findClass(String) BIND cls:byte[] = io.opentracing.contrib.specialagent.Agent.findClass($this, $1); IF cls != null DO traceln(">>>>>>>> defineClass(" + $1 + ")"); RETURN $this.defineClass($1, cls, 0, cls.length, null); ENDRULE
When run in a jvm9+ runtime, I get the following in the verbose logs:
retransforming java.net.URLClassLoader
retransforming jdk.internal.loader.Loader
retransforming jdk.internal.loader.BuiltinClassLoader
org.jboss.byteman.agent.Transformer : possible trigger for rule OpenTracing SpecialAgent ClassLoader Injection in class java.net.URLClassLoader
RuleTriggerMethodAdapter.injectTriggerPoint : inserting trigger into java.net.URLClassLoader.findClass(java.lang.String) java.lang.Class for rule OpenTracing SpecialAgent ClassLoader Injection
org.jboss.byteman.agent.Transformer : inserted trigger for OpenTracing SpecialAgent ClassLoader Injection in class java.net.URLClassLoader
org.jboss.byteman.agent.Transformer : possible trigger for rule OpenTracing SpecialAgent ClassLoader Injection in class jdk.internal.loader.Loader
RuleTriggerMethodAdapter.injectTriggerPoint : inserting trigger into jdk.internal.loader.Loader.findClass(java.lang.String) java.lang.Class for rule OpenTracing SpecialAgent ClassLoader Injection
org.jboss.byteman.agent.Transformer : inserted trigger for OpenTracing SpecialAgent ClassLoader Injection in class jdk.internal.loader.Loader
org.jboss.byteman.agent.Transformer : possible trigger for rule OpenTracing SpecialAgent ClassLoader Injection in class jdk.internal.loader.BuiltinClassLoader
RuleTriggerMethodAdapter.injectTriggerPoint : inserting trigger into jdk.internal.loader.BuiltinClassLoader.findClass(java.lang.String) java.lang.Class for rule OpenTracing SpecialAgent ClassLoader Injection
org.jboss.byteman.agent.Transformer : inserted trigger for OpenTracing SpecialAgent ClassLoader Injection in class jdk.internal.loader.BuiltinClassLoader
install rule OpenTracing SpecialAgent ClassLoader Injection
install rule OkHttp3 install tracing interceptor (Load Classes)
install rule OkHttp3 install tracing interceptor
However, when run in jvm1.7 or jvm1.8, I get the following in the verbose logs:
retransforming java.net.URLClassLoader
RuleCheckMethodAdapter.checkBindings : unsatisfiable local variable binding $this checking method findClass(Ljava/lang/String;)Ljava/lang/Class;
org.jboss.byteman.agent.Transformer : possible trigger for rule OpenTracing SpecialAgent ClassLoader Injection in class java.net.URLClassLoader
org.jboss.byteman.agent.Transformer : inserted trigger for OpenTracing SpecialAgent ClassLoader Injection in class java.net.URLClassLoader
install rule OpenTracing SpecialAgent ClassLoader Injection
install rule OkHttp3 install tracing interceptor (Load Classes)
install rule OkHttp3 install tracing interceptor
The rule executes properly in jvm9+, but does not in jvm1.7 or jvm1.8.
I attempted to change $this to $0, but as expected, it's the same error. As far as I understand, it seems to me that the rule is fully legit, and should pass all type and binding checks. Am I missing something?