我正在为Dalvik字节码写入工具,该代码为各种方法调用条目执行一些日志记录。具体来说,在各种方法调用站点上,我将插入一组指令来收集参数,将它们放入一个Object[]
数组中,然后将其传递给日志记录功能。Dalvik验证器中的参考与精确参考
这一切都很好,我已经实现并获得了大部分应用程序的所有功能。但我遇到一个特别令人费解的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与String应该是一个对象冲突。
这里的字节码的转储,通过杰布完成:https://gist.github.com/kmicinski/c8382f0521b19643bb24379d91c47d36 正如你所看到的,0x570是不是存在一个字节码指令的开始。另外,据我所知,在这个方法的任何地方'r5'都没有以不正确的方式被使用(尽管控制流是有一定难度的,这就是为什么有一个精确的错误指数会有所帮助) –
@KristopherMicinski我编辑过我的帖子中有一个控制流示例,它不正确地导致v5是一个非String对象。 – Antimony
谢谢!哇,你真的超越了,代码真的很难解释。我一定会仔细看看并接受你的答案。 –