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



我对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使用该值并返回它。

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

谢谢!

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

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

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

相关内容

  • 没有找到相关文章

最新更新