用于调试VerifyError的好工具?

时间:2012-04-02 07:31:50

标签: java debugging bytecode verifyerror

我发现字节码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 - 类似输出
  • 对行号(或操作码字节偏移)的引用
  • 每行的操作数堆栈信息(类型/深度)
  • 更具描述性的错误消息

2 个答案:

答案 0 :(得分:2)

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

目前还没有用于打印验证信息的特定界面,但如果您还是我想要的功能,我可以添加一个。与此同时,尝试使用Krakatau反编译您的类将打印出一条错误消息,其中包含有关验证错误的信息以及发生错误的指令的类型信息。

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

答案 1 :(得分:1)

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