2013-03-20 50 views
2

我使用BCEL生成ByteCode,我只是想在輸入類的靜態方法的每一行之前打印出(println)。我嘗試了使用BCEL的儀器,但它導致了不同形式的錯誤。它說使用BCEL跟蹤java字節碼中的每條指令

Exception in thread "main" java.lang.VerifyError: StackMapTable error: bad offset in method C.max(Ljava/lang/String;II)I 

有時它開始工作,如果我對任何指令放置一些靜態方法調用,有時它不會。任何幫助將非常感激...

更新:我修好了。它不是BCEL庫中的東西,它是JDK版本(1.7),它不驗證我的工具類。所以如果有人遇到這樣的問題,可以使用JDK 1.6或使用JVM選項「-XX:-UseSplitVerifier」。

乾杯

回答

1

StackMapTable是在50.0引入並在51.0其意在通過包括關於類型在代碼的各個點的元數據以加快類文件驗證強制性的特徵。不幸的是,手工編寫或調整是一件很痛苦的事情,所以除非你使用一種能夠自動生成它的工具,否則你最好只是完全刪除它。

爲了省略StackMapTable,您需要將類更改爲版本50.0或更低版本。但是這不應該是一個真正的問題,因爲在51.0中添加的唯一功能是invokedynamic及其關係,它們從來沒有被編譯過的Java使用過。

0

我有類似的問題,在目前使用BCEL,我只是想說明JVM -XX:-UseSplitVerifier ARG不再提供的Java 8