使用BCEL跟踪java字节码中的每条指令
我使用BCEL生成字节码,我只想在输入类的静态方法中的每一行之前打印(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)没有验证我的插入指令的类。因此,如果有人遇到这样的问题,可以使用JDK1.6或使用JVM选项“-XX:-UseSplitVerifier”
干杯
# 1 楼答案
目前我在使用BCEL时遇到了类似的问题,我只想指出JVM-XX:-UseSplitVerifierarg在Java8中不再可用
# 2 楼答案
StackMapTable
是50.0中引入的一个特性,在51.0中是强制性的,旨在通过在代码中的各个点包含关于类型的元数据来加速类文件验证。不幸的是,手工编写或调整是一件痛苦的事情,所以除非您使用的是一个能够自动生成它的工具,否则最好是完全删除它为了省略StackMapTable,您需要将该类更改为50.0或更早版本。但这不应该是一个真正的问题,因为51.0中添加的唯一特性是
invokedynamic
及其关系,编译后的Java从未使用过这些特性