作者:严气 | 来源:互联网 | 2023-02-05 21:13
我正在Dalvik字节码上编写工具,该代码对各种方法调用条目执行一些日志记录。具体来说,在各种方法调用站点,我将插入一组指令,这些指令收集参数,将其放入Object[]
数组中,然后将其传递给日志记录函数。
这一切都很好,很好,我已经实现并克服了大多数应用程序的所有麻烦。但是我遇到了一个特别难以理解的Dalvik验证程序错误:
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放入对象数组中。
我在这里有几个问题:
什么是精确参考,为什么它与参考不兼容?
这里的偏移量是什么意思?[0x570]
指向字节码指令的中间,因此不会清楚地映射到任何指令:那里的指令不涉及v5
。
我将如何调试呢?理想情况下,我想知道验证者认为应该发生的情况并加以解决。
编辑:
这是我正在谈论的方法的字节码的转储。https://gist.github.com/kmicinski/c8382f0521b19643bb24379d91c47d36正如你所看到的,0x570不是指令的开始,(据我可以告诉)没有任何地方有一个字符串,其中R5冲突它应该是一个对象。