java - Java字节码指令组合对操作数栈的影响

标签 java assembly bytecode

对于使用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/

相关文章:

Java - 将通用类的实例转换为专用类的实例

delphi - ASM/德尔福 - 划分

linux - 在汇编程序中编写 linux 内核模块时的内存访问

java - 如何使用调试日志信息动态生成堆栈帧

java - 在 Jersey 中使用@Context HttpServletRequest 和@FormDataParam 进行多文件上传

java - 提取句子中连续单词的正则表达式

java - 当应用程序是更改的所有者时禁用 Google 日历推送通知

c++ - 逻辑/算术移位越少位越快吗?

java - 为什么 Java 类的编译与空行不同?

java - 使用WALA分析Java字节码时,如何去掉不相关的类?