2013-03-07 74 views
2

我是相當新的Java字節碼。我使用BCEL來生成字節碼,但是當我嘗試使用生成的代碼時,我收到一條錯誤消息。 (回想起來,這看起來像ObjectWeb的ASM更先進,更通常大於BCEL使用。)的VerifyError:堆棧尺寸過大(?這是什麼意思)

以下是錯誤消息:

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消耗該值並將其返回。

我在做什麼錯?這裏有足夠的信息來說明嗎?

謝謝!

回答

7

你必須聲明你使用的每個Java方法的最大堆棧大小。例如,ASM可以自動計算這些值,這爲您節省了很多麻煩。最大堆棧大小是您在該方法中使用的絕對最大槽數(一次,不累計)。分支時計算可能會非常棘手。

你加載這裏long值,long小號消耗2個堆棧插槽(事實上,每64位值(除指針)消耗2個堆棧槽),所以你必須在這裏設置爲2的最大堆棧大小。

Stack size too large只是告訴大家,在方法描述符中指定你的方法消耗更多的棧槽。

+0

謝謝。有效! //堆棧:2,當地人:1 – user1324109 2013-03-07 15:55:32

+0

不客氣。 – Neet 2013-03-07 16:36:02