gpt4 book ai didi

java - jvm 字节码中的堆栈映射表是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:06 26 4
gpt4 key购买 nike

我正在学习用于生成字节码的 ASM 库。在某些时候我犯了错误的局部变量类型并得到了一个错误:

Exception in thread "main" java.lang.VerifyError: Bad local variable type
Exception Details:
Location:
Loops.start()V @56: aload_1
Reason:
Type top (current frame, locals[1]) is not assignable to reference type


Stackmap Table:
full_frame(@24,{Object[#2],Object[#9]},{Integer})
full_frame(@25,{Object[#2],Object[#9]},{Integer,Integer})
same_locals_1_stack_item_frame(@44,Integer)
full_frame(@45,{Object[#2],Object[#9]},{Integer,Integer})
full_frame(@48,{Object[#2]},{Integer})
full_frame(@80,{Object[#2],Integer},{Integer})
full_frame(@81,{Object[#2],Integer},{Integer,Integer})
full_frame(@87,{Object[#2]},{Integer})
full_frame(@119,{Object[#2],Integer},{Integer})
full_frame(@120,{Object[#2],Integer},{Integer,Integer})
same_locals_1_stack_item_frame(@123,Integer)

问题不难发现和解决,但我很好奇这个堆栈映射表是什么东西?

最佳答案

StackMapTable是使用 Java 6 或更高版本编译的类中的一个属性。它在 verification by type checking 的过程中被 JVM 使用.

基本上,堆栈映射框架定义了局部变量的预期类型和方法在执行期间的操作数堆栈(即框架的状态)。在运行时,如果预期类型和实际类型不兼容,JVM 将抛出 VerifyError

为了节省篇幅,并不是每条指令都有对应的帧。该表仅定义潜在跳转目标或异常处理程序的帧。从这些框架可以很容易地推断出其他框架。您可以在上表中看到,帧仅针对某些字节码偏移定义。

关于java - jvm 字节码中的堆栈映射表是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37309074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com