2013-10-05 24 views
2

我一直在學習如何編碼smali文件,並且我創建了一個接受字符串參數並將其放入log.Its java的等價物是類似的東西這樣的:android dalvik驗證錯誤:register1 v1類型0,通緝參考

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

當我再次smalied,並簽署了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 

任何人都可以解釋給我我如何調試這個錯誤?

+0

反彙編生成的DEX。它看起來是你期望的方式嗎? – fadden

+0

我拆開了它,它和我的預期完全一樣 – gkapagunta

回答

2

p1在該上下文中是無效的寄存器。事實上,baksmali應該抓住了! :)

使用.registers 2和一個參數,您有註冊v0和v1,其中p0被別名爲v1。根據您的.registers指令,p1實際上是v2,這是不允許的。

你想要的是

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(即,第一指令)。但是,如果不清楚它指的是哪一條指令,那麼可以使用-f選項指定baksmali,這會導致它在每條指令之前添加字節碼偏移量作爲註釋。

+0

我也有些困惑,以前沒有在達爾維克遇到過這個問題。在它到達驗證寄存器類型的地步之前,我會預料到有關無效寄存器的錯誤。 – JesusFreke

+0

謝謝!這解決了我的問題,現在它的工作正常:)我用p0替換了兩個p1。 – gkapagunta

+0

或者,你能告訴我什麼是學習編程smali文件的最佳方法嗎? – gkapagunta

1

除了JesusFreke的回答外,p0沒有在示例中引用Java this,因爲函數是靜態的。正如耶穌弗雷克所說,所以爭論始於第0頁。