我发现字节码VerifyErrors
非常难以调试。 JVM提供的反馈很少,通常只是当前类,有时是方法。
通过ASM或Jasmin手动设计字节码时,我经常遇到的一些错误示例:
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
- 类似输出答案 0 :(得分:2)
我写的Kraktau project对于调试验证错误非常有用。它能够给出发生错误的字节码偏移量,以及每条指令的堆栈和本地类型信息。它甚至可以正确处理子程序的标志和掩码信息。它几乎可以捕获所有错误。
目前还没有用于打印验证信息的特定界面,但如果您还是我想要的功能,我可以添加一个。与此同时,尝试使用Krakatau反编译您的类将打印出一条错误消息,其中包含有关验证错误的信息以及发生错误的指令的类型信息。
更新:由于性能问题,Krakatau不再执行验证。如果您想进行验证,则需要签出提交3724c05ba11ff6913c01ecdfe4fde6a0f246e5db。
答案 1 :(得分:1)
我认为您可以使用ASM提供的CheckClassAdapter(http://asm.ow2.org/asm40/javadoc/user/org/objectweb/asm/util/CheckClassAdapter.html)。它提供了有关验证错误的更详细信息。