11

バイトコード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-出力のような
  • 行番号(またはオペコードバイトオフセット)への参照
  • 各行のオペランドスタック情報(タイプ/深さ)
  • より説明的なエラーメッセージ
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 に答える