0

logcatこれまでのところ、任意のメソッドにトレースを追加するために、メソッドを 1 つだけ使用して smali クラスを作成しました。アプリをコンパイルして起動できますが、メソッドは何も出力しません。

このローカル パラメータの単純tagなローカル パラメータが 1 つあり、トレースを追加するメソッドから取得します。何か問題があると思いますが、dalvik デバッガーは何も問題を出力しないため、自分の間違いがどこにあるのかわかりません。logcatv0p0

以下は私のコードです。

.class public Landroid/MyCustomClass;
.super Ljava/lang/Object;
.source "MyCustomClass.java"

.method public static add_trace(Ljava/lang/String;)V
    .locals 1

    .prologue   
    const-string v0, "myTag" 

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

    .line 13
        return-void
.end method

メソッドを呼び出す方法の例を次に示します。

.method public constructor <init>()V
    .locals 1

    .prologue
    .line 157
    const-string v0, "settings.properties"

    invoke-direct {p0, v0}, Lse/smartrefill/AbstractApplication;-><init>(Ljava/lang/String;)V

    .line 158
    # has been edited 
    const-string v0, "<init>()V" 
    invoke-static {v0}, Landroid/MyCustomClass;->add_trace(Ljava/lang/String;)V 
    return-void
.end method

さらに先に進むために、メソッドの返されたレジスタの値も出力する方法があるかどうかを知りたいです。

Java のすべてのタイプの変数は Object から継承され、Object にはメソッドがあるtoString()ため、理論的にはメソッドをカスタマイズadd_trace()して実行時に返されたレジスタの値を取得できることを認識しています。誰かがそれを手伝ってくれますか?

ありがとう。

4

1 に答える 1

0

次のようにメソッドを変更して、問題の最初の部分を解決しました。

.method public static add_trace(Ljava/lang/String;)V
    .locals 1
    .param p0, "my_message" # Ljava/lang/String;

    .prologue   
    const-string v0, "my_tag" 

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

    .line 13
        return-void
.end method

返されたレジスタを出力するコードは次のとおりですが、まだテストしていません。

.method public static add_trace(Ljava/lang/String;Ljava/lang/Object;)V
    .locals 3
    .param p0, "my_message"     # Ljava/lang/String;
    .param p1, "returned_register"  # Ljava/lang/Object;

    .prologue   
    .line 25
    const-string v0, "my_tag" 

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1, p0}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    const-string v2, ":"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

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

    .line 48
    return-void
.end method
于 2015-06-28T18:58:06.820 に答える