私は、さまざまなメソッド呼び出しエントリのログをいくつか実行するDalvikバイトコードの計測器を書いています。具体的には、さまざまなメソッド呼び出しサイトで、パラメータを収集し、配列Object[]
に配置し、それをロギング関数に渡す一連の命令を挿入します。Dalvik Verifierのリファレンスと正確なリファレンス
これはすべてうまくいきました。私は実装して、ほとんどのアプリですべてのkludgesを過ぎました。
java.lang.VerifyError: Verifier rejected class io.a.a.g: void io.a.a.g.r()
failed to verify: void io.a.a.g.r(): [0x570] register v5 has type Reference:
java.lang.Object but expected Precise Reference: java.lang.String
は私が私の計装によって生成されたコードを見て、私がやっているすべてのオブジェクトの配列内のレジスタV5を置くことである。しかし、私は一つの特に不可解なのDalvik検証エラーに遭遇しています。
私はここにいくつか質問があります:
- は正確参照は何ですか、そしてなぜそれが参照すると互換性がありませんか?
- ここでのオフセットとは何ですか?
[0x570]
は、バイトコード命令の中点を指しているため、指示に明確には対応していません。その周辺の命令にはv5
が含まれていません。 - これをデバッグするにはどうすればよいですか?理想的には、私は検証者が何が起こっていると思うかを知り、それを修正したいと思います。
EDIT:
はここで私が話してメソッドのバイトコードのダンプです。 https://gist.github.com/kmicinski/c8382f0521b19643bb24379d91c47d36ご覧のとおり、0x570は命令の始まりではありません。(私が知る限りは)r5がオブジェクトとなるStringと競合する場所はありません。
はここJEBを介して行わバイトコードのダンプ、です:あなたが見ることができるようにhttps://gist.github.com/kmicinski/c8382f0521b19643bb24379d91c47d36 、0x570は、バイトコード命令の開始として存在するものではありません。さらに、私が言うことができる限り、 'r5'はこのメソッド内のどの場所でも間違った方法で使用されていません(コントロールフローは少し難しいですが、正確なエラーインデックスを持たせるのが助けになります) –
@KristopherMicinski私は編集しました私のポストは、v5が非Stringオブジェクトである不適切な結果となるコントロールフローの例を示しています。 – Antimony
ありがとう!うわー、あなたは本当に上を行きました、そのコードは本当に解釈するのが難しいです。私は間違いなくこれを見て、あなたの答えを受け入れるでしょう.. –