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