繁体   English   中英

android dalvik验证错误:register1 v1类型0,想要参考

[英]android dalvik verification error: register1 v1 type 0, wanted ref

我一直在学习如何编码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

谁能向我解释我该如何调试此错误?

在这种情况下,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

关于如何调试此类错误,您可能要做的最好的事情是在dalvik源代码中查找看到的VFY错误字符串,并准确确定错误消息的含义(即,错误条件是什么)触发),以及在字节码中发生错误的位置。

为了确定错误发生的字节码的位置,请查看错误行

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选项,这将导致它在每条指令之前添加字节码偏移量作为注释。

只是一个除了JesusFreke的回答,P0未引用的Java this的例子作为函数是静态的。 因此,论点始于p0,正如JesusFreke所说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM