对于使用ASM手动编写的Java字节码指令序列,有没有办法访问堆栈的状态?例如,对于如下组合:
ILOAD_0,ILOAD_1,IADD,DUP -> 1,1
这里的动机是编写测试代码以验证给定的指令集是否会导致给定的堆栈,例如
assert getCurrentStackLength() == 2
或
assert getTopElement() == (int) 1
等等。
答案 0 :(得分:2)
堆栈是JVM的内部细节,实际上可能并不存在。
典型的JVM有两种操作模式 - 解释和JIT编译。 Intertaation实际上模拟了堆栈和本地。 JIT编译将所有内容编译为机器代码,因此不存在操作数堆栈或局部变量表。
基本上,您需要做的是查看JVM的代码,找到一种方法来强制它始终解释您的代码,添加调试代码以打印出堆栈等,然后重新编译并重建所有内容。对于胆小的人来说,显然不是一项任务。
然而,更大的问题是你想要这样做的原因。您是否尝试对JVM进行单元测试?您编写的任何代码都比您正在测试的代码更容易出错。
如果您只想找到字节码中特定点的堆栈和本地状态,那么您只需要一个静态验证器。那里有很多。如果你有兴趣,我写了one that's on Github。