使用BCEL跟踪java字节码中的每条指令

时间:2013-03-20 16:41:18

标签: java bytecode bcel

我正在使用BCEL生成ByteCode,我只想在输入类的静态方法的每一行之前打印出(println)。我尝试使用BCEL进行检测,但会导致不同形式的错误。它说

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”。

干杯

2 个答案:

答案 0 :(得分:1)

StackMapTable是50.0中引入的一项功能,在51.0中强制实施,旨在通过在代码中的各个点包含有关类型的元数据来加速类文件验证。不幸的是,手动编写或调整是一件痛苦的事情,所以除非你使用的工具会自动生成它,否则你最好完全删除它。

为了省略StackMapTable,您需要将类更改为50.0或更早版本。但这不应该是一个真正的问题,因为51.0中添加的唯一功能是invokedynamic及其关系,编译的Java从未使用它们。

答案 1 :(得分:0)

目前我在使用BCEL时遇到类似问题,我只想注意 Java 8 中不再提供JVM -XX:-UseSplitVerifier arg。