11

我发现字节码VerifyErrors非常难以调试。JVM 提供的反馈很少,通常只是当前类,有时是方法。

通过ASMJasmin手动设计字节码时,我通常会遇到一些错误示例:

  • Stack size too large
  • Unable to pop operand off an empty stack
  • Falling off the end of the code
  • Expecting to find object/array on stack
  • Incompatible object argument for function call
  • Inconsistent stack height 4 != 2

(要清楚;我知道所有这些意味着什么,我对调试它们的原因的工具或技术感兴趣。)

我的问题:是否有任何工具可以对这些类型的错误提供详细的反馈?例如,我会欣赏诸如

  • javap- 类似的输出
  • 对行号(或操作码字节偏移)的引用
  • 每行的操作数堆栈信息(类型/深度)
  • 更具描述性的错误消息
4

2 回答 2

3

我编写的Kraktau 项目对于调试验证错误很有用。它能够提供发生错误的字节码偏移量,以及每条指令的堆栈和本地类型信息。它甚至可以正确处理子程序的标志和掩码信息。它能够捕捉几乎所有的错误。

目前还没有具体的打印验证信息的接口,但是如果你还是我想要什么样的功能,我可以加一个。同时,尝试使用 Krakatau 反编译您的类将打印出一条错误消息,其中包含有关验证错误的信息以及发生错误的指令的类型信息。

更新:由于性能问题,Krakatau 不再执行验证。如果要进行验证,则需要签出提交3724c05ba11ff6913c01ecdfe4fde6a0f246e5db

于 2012-10-12T02:24:20.917 回答
3

我认为您可以使用ASM 提供的CheckClassAdapter( http://asm.ow2.org/asm40/javadoc/user/org/objectweb/asm/util/CheckClassAdapter.html )。它提供有关验证错误的更多详细信息。

于 2013-07-25T05:51:53.123 回答