我已經使用 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 @Timed10 public void writeName() {11 final String myLocal = "Tom";12 System.out.println(myLocal); 13 }1415 }“建議”: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().
2 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
請參閱Eclipse 錯誤 531706:
當并非所有類都已檢測時會出現此問題,請參閱Tobias Hirning 的評論 #4:
...
現在我也有了更清晰的認識:錯誤僅出現在方法位于 jar 文件中的方法調用中。我認為他們沒有使用儀器。
...
錯誤發生在 VM 中,而不是 Eclipse 中。當 Eclipse 通過調試接口請求變量時,會返回錯誤代碼35
而不是值。由于提到的錯誤報告所做的更改是忽略它,請參閱Till Brychcy(做出更改的人)的評論 #7:
...
我已經能夠重現該問題,只需忽略此代碼路徑中的 InternalException 即可改善這種情況。
您有時會在變量視圖中看到有關錯誤代碼 35 的消息,但通常它似乎有效。
為避免此問題,您必須檢測所有類。

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
解決方法
啊哈!我四處尋找補丁的所有釣魚活動使我找到了我希望早點找到的東西。
我可以
@OnMethodEnter(prependLineNumber = false)
用來避免行號的問題。并且使用
@OnMethodExit(backupArguments = false)
避免了插槽的問題。
這對我來說是個好消息!然而,據推測,這些并不是有充分理由的默認值。我還不明白使用這些選項是否會產生重要的負面影響。
添加回答
舉報
0/150
提交
取消