我已经使用 net.bytebuddy.asm.Advice 在适当注释的方法之前和之后添加代码,以启动和停止计时器。修改后的类在它们的原始类可以被引用之前被手动加载到目标类加载器中,从而取代它们。我正在使用 OSGi (Equinox)。
非常棒,但是当我在目标方法的断点上停止 Eclipse (Photon 4.8.0) 调试器时,变量视图仅显示:
com.sun.jdi.InternalException:在回复中得到错误代码:35 发生从堆栈帧检索“this”。
这是不可避免和不可避免的吗?如果这使得检测的代码不可调试,那有点破坏了我的用例:(
(我已禁用选项“在步骤操作后显示方法结果(如果 VM 支持;可能很慢”。)
例子
我相信我可能已经发现生成的字节码存在一些问题。
要检测的类:
1 package com.tom.test;
2
3 import com.tom.instrument.Instrumented;
4 import com.tom.instrument.Timed;
5
6 @Instrumented(serviceType = "blah")
7 public class Test {
8
9 @Timed
10 public void writeName() {
11 final String myLocal = "Tom";
12 System.out.println(myLocal);
13 }
14
15 }
“建议”:
package com.tom.instrument;
import net.bytebuddy.asm.Advice.OnMethodEnter;
public class Instrumentation {
@OnMethodEnter
public static void onMethodEnter() {
System.out.println("Enter");
}
}
呼叫字节好友:
new ByteBuddy()
.redefine(type, ClassFileLocator.ForClassLoader.of(this.classLoader))
.visit(Advice.to(Instrumentation.class)
.on(isAnnotatedWith(Timed.class)))
.make().saveIn(new File("instrumented"));
也许这是 Eclipse 调试器希望this
始终位于插槽 0 中的错误?或者也许这就是它应该的方式。不过,错误代码 35 来自 JVM。
添加退出建议更改插槽的原因似乎是因为它导致ForInstrumentedMethod.Default.Copying
使用而不是Simple
. 他们有不同的variable()
.
临摹微笑
慕的地6264312
相关分类