2

私はsmaliファイルをコーディングする方法を学んでおり、文字列パラメータを取り、それをログに入れる特定のメソッドを作成しました.そのJava同等物は次のようなものです:

public void log(String param){
        Log.d(param, param);
    }

そして、もう一度それをスマイルしてapkに署名したとき、logCatに次のエラーが表示されました:

10-05 21:52:42.081: W/dalvikvm(32021): VFY: register1 v2 type 0, wanted ref
10-05 21:52:42.081: W/dalvikvm(32021): VFY: bad arg 0 (into Ljava/lang/String;)
10-05 21:52:42.081: W/dalvikvm(32021): VFY:  rejecting call to Landroid/util/Log;.d (Ljava/lang/String;Ljava/lang/String;)I
10-05 21:52:42.081: W/dalvikvm(32021): VFY:  rejecting opcode 0x71 at 0x0000
10-05 21:52:42.081: W/dalvikvm(32021): VFY:  rejected Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)V
10-05 21:52:42.081: W/dalvikvm(32021): Verifier rejected class Lcom/shqipe/worthstream/utils/Utils;
10-05 21:52:42.081: D/AndroidRuntime(32021): Shutting down VM

これは、smali ファイルのメソッドです。

.method public static log(Ljava/lang/String;)V
    .registers 2
    .parameter "paramString"
    .prologue


    invoke-static {p1, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 63
    return-void
.end method

このエラーをデバッグする方法を誰かに説明してもらえますか?

4

2 に答える 2

3

p1 は、そのコンテキストでは無効なレジスタです。実際、バクスマリはそれをキャッチする必要がありました! :)

.registers 2 と 1 つの引数を使用すると、レジスタ v0 と v1 があり、p0 は v1 にエイリアスされます。p1 は実際には v2 になりますが、これは .registers ディレクティブでは許可されていません。

あなたが欲しいのは

invoke-static {p0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

または同等に

invoke-static {v1, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

この種のエラーをデバッグする方法に関しては、表示される VFY エラー文字列の dalvik ソース コードを調べて、エラー メッセージの意味を正確に特定するのが最善の方法です (つまり、エラー状態が何であるか)。トリガーされた)、およびバイトコード内のどこでエラーが発生したか。

エラーが発生したバイトコードの場所を特定するには、エラー行を確認します

10-05 21:52:42.081: W/dalvikvm(32021): VFY:  rejecting opcode 0x71 at 0x0000
10-05 21:52:42.081: W/dalvikvm(32021): VFY:  rejected Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)V

Lcom/shqipe/worthstream/utils/Utils;.log (Ljava/lang/String;)Vこれは、バイトコード オフセット 0 (つまり、最初の命令) でメソッド内でエラーが発生したことを示しています。ただし、参照している命令が明確でない場合は、baksmali に -f オプションを使用できます。これにより、各命令の前にバイトコード オフセットがコメントとして追加されます。

于 2013-10-05T17:27:24.757 に答える
1

JesusFrekeの答えに加えて、p0はthis関数が静的であるため、例のJavaを参照しません。したがって、JesusFreke が言ったように、引数は p0 から始まります。

于 2013-10-19T13:11:15.337 に答える