2

ASM を使用して手動で記述された一連の Java バイトコード命令について、スタックのステータスにアクセスする方法はありますか? たとえば、以下のような組み合わせの場合:

ILOAD_0,ILOAD_1,IADD,DUP -> 1,1

ここでの動機は、テスト コードを記述して、特定の命令セットが次のような特定のスタックにつながることを確認することです。

assert getCurrentStackLength() == 2

また

assert getTopElement() == (int) 1

等々。

4

1 に答える 1

2

スタックはJVMの内部詳細であり、実際には存在しない場合があります。

一般的なJVMには、解釈とJITコンパイルの2つの動作モードがあります。Interpertationは、実際にはスタックとローカルをシミュレートします。JITコンパイルはすべてをマシンコードにコンパイルするため、オペランドスタックやローカル変数テーブルなどはありません。

基本的に、あなたがしなければならないことは、JVMのコードを調べ、常にコードを解釈するように強制する方法を見つけ、スタックを出力するためのデバッグコードを追加するなど、すべてを再コンパイルして再構築することです。明らかに、気弱な人にとっては仕事ではありません。

ただし、より大きな問題は、なぜこれを実行するのかということです。JVMをユニットテストしようとしていますか?あなたが書いたコードは、あなたがテストしているものよりもバグを持っている可能性が高いです。

バイトコードの特定のポイントでスタックとローカルの状態を確認するだけの場合、必要なのは静的ベリファイアだけです。そこにはたくさんあります。興味があれば、Githubにあるものを書きました。

于 2013-03-19T16:54:52.697 に答える