【问题标题】:VerifyError: Stack size too large (what does it mean?)VerifyError:堆栈大小太大(这是什么意思?)
【发布时间】:2013-03-07 12:06:28
【问题描述】:

我对 Java 字节码还很陌生。我正在使用 BCEL 生成字节码,但是当我尝试使用生成的代码时收到一条错误消息。 (事后看来,ObjectWeb ASM 似乎比 BCEL 更先进、更常用。)

这是错误信息:

Exception in thread "main" java.lang.VerifyError: 
(class: cb/io/FileDescriptor, method: set 
 signature: (I)J) 
Stack size too large

方法如下:

// Method descriptor #4 (I)J
// Stack: 0, Locals: 1
private static long set(int arg1);
  0  lconst_0
  1  lreturn
    Local variable table:
      [pc: 0, pc: 2] local: arg1 index: 0 type: int

据我了解,局部变量表是正确的,因为它与输入参数匹配。我没有添加“this”变量,因为该方法是静态的。

如果我没记错的话,lconst_0 会将一个 long 值 0 加载到堆栈中,然后 lreturn 会使用该值并返回它。

我做错了什么?这里有足够的信息可以说明吗?

谢谢!

【问题讨论】:

    标签: java assembly bcel


    【解决方案1】:

    您必须声明用于每个 Java 方法的最大堆栈大小。例如 ASM 可以自动计算值,这为您省去了很多麻烦。最大堆栈大小是您在该方法中使用的插槽的绝对最大数量(一次,不累积)。进行分支时,计算会变得非常棘手。

    你在这里加载了一个long 值,longs 消耗 2 个堆栈槽(实际上,每个 64 位值(指针除外)消耗 2 个堆栈槽),所以你必须设置最大堆栈大小2 这里。

    Stack size too large 只是告诉您,您的方法会消耗更多的堆栈槽,如方法描述符中指定的那样。

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 2020-06-26
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多