2

对于使用 ASM 手动编写的 Java 字节码指令序列,有没有办法访问堆栈的状态?例如,对于如下组合:

ILOAD_0,ILOAD_1,IADD,DUP -> 1,1

这里的动机是编写测试代码来验证给定的指令集是否导致给定的堆栈,例如

assert getCurrentStackLength() == 2

或者

assert getTopElement() == (int) 1

等等。

4

1 回答 1

2

堆栈是 JVM 的内部细节,实际上可能并不存在。

典型的 JVM 有两种操作模式——解释和 JIT 编译。Interpertation 实际上模拟了堆栈和局部变量。JIT 编译将所有内容编译为机器代码,因此不存在操作数堆栈或局部变量表之类的东西。

基本上,您需要做的是查看 JVM 的代码,找到一种方法强制它始终解释您的代码,添加调试代码以打印出堆栈等,然后重新编译并重建所有内容。显然不是胆小的人的任务。

然而,更大的问题是你为什么要这样做。您是否尝试对 JVM 进行单元测试?您编写的任何代码都比您正在测试的代码更有可能出现错误。

如果您只想找出字节码中特定点的堆栈和局部状态,那么您只需要一个静态验证器即可。那里有很多。如果你有兴趣,我已经在 Github 上写了一篇。

于 2013-03-19T16:54:52.697 回答