使用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)没有验证我的仪器化类。因此,如果有人遇到这样的问题,请使用JDK 1.6或使用JVM选项"-XX:-UseSplitVerifier"。

欢呼

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

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

我现在使用BCEL有类似的问题,我只是想注意JVM -XX:-UseSplitVerifier arg在Java 8中不再可用。

相关内容

  • 没有找到相关文章

最新更新