VerifyError:堆栈大小太大(这是什么意思?)

时间:2013-03-07 12:06:28

标签: java assembly bcel

我是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会将一个长值0加载到堆栈上,并且lreturn会消耗该值并返回它。

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

谢谢!

1 个答案:

答案 0 :(得分:7)

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

您在此处加载long值,long消耗2个堆栈插槽(事实上,每64位值(指针除外)消耗2个堆栈插槽),因此您必须在这里设置最大堆栈大小为2。

Stack size too large只是告诉你你的方法消耗了更多的方法描述符中指定的堆栈槽。

相关问题