2

我正在使用 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”。

干杯

4

2 回答 2

1

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

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

于 2013-03-20T17:09:28.377 回答
0

目前我在使用 BCEL 时遇到了类似的问题,我只想指出 JVM -XX:-UseSplitVerifier arg 在Java 8中不再可用。

于 2015-10-07T06:41:28.930 回答