- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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 与应该是对象的 String 没有任何冲突。
最佳答案
如果您仔细查看该错误,它告诉您您正在传递一个 Object
,而应该是一个 String
。无论如何,除非您发布导致问题的实际字节码,否则没有什么可以说的了。
你确定 0x570 指向一条指令的中间吗?它不应该。无论如何,调试它的方法是查看相关指令并弄清楚为什么 r5 是一个对象,而它应该是一个字符串。或者您可以发布字节码,以便我查看。
编辑:现在您已经发布了代码,实际上有一条路径导致 v5 成为对象,但它有点微妙
异常处理器.catch JSONException {:5D8 .. :938} :BDE
跳转到 :BDE
异常处理程序的代码将捕获的异常存储在 v5 中,这意味着此时 v5 不再是 String。然后跳转到 :162
:BDE
00000BDE move-exception v5
00000BE0 const v0, 0x00488B36
00000BE6 invoke-static Logger->logBasicBlockEntry(I)V, v0
00000BEC goto/16 :162
:162
在另一个异常处理程序的范围内:.catch ClassNotFoundException {:2E .. :594} :BF0
:Bf0
保持 v5 不变并跳转到 :A28
:BF0
00000BF0 move-exception v6
00000BF2 const v0, 0x00488B3E
00000BF8 invoke-static Logger->logBasicBlockEntry(I)V, v0
00000BFE goto/16 :A28
:A28
是假定 v5 是字符串的代码块的开头。特别是,在指令 :AE0
中,v5 被传递给一个接受字符串的函数。
00000AE0 invoke-virtual StringBuilder->append(String)StringBuilder, v7, v5
0xAE0 恰好是 0x570 的两倍,这解释了错误中显示的偏移量,一旦您按照 JesusFreke 的建议调整了代码单元。
请注意,这不一定是唯一损坏的代码路径,它只是我在查看您的代码时发现的第一个。然而,一条错误的路径足以将 v5 的类型与 JSONException 统一起来,从而将其转换为 Object。
关于android - Dalvik Verifier 中的引用与精确引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554462/
我一直在开发数字签名 Node.js 应用程序,然后我遇到了我无法弄清楚的奇怪行为。 首先我生成了公钥/私钥对 described here 然后我实现了以下脚本 const crypto = r
缺少[路由:验证。通知] [URI:{language} / email / verify]所需的参数 使用本地化后,我将laravel电子邮件验证添加到了我的项目中。 但是现在我遇到了问题:Rout
我用对象列表调用方法 performAction 并验证相同的方法。调用此方法后,我修改了一些“对象”。 Mockito 验证失败,说参数不匹配(显示修改的对象),但我可以在 Debug模式下看到对象
我在处理opensl时遇到麻烦,提示无法在具有CA链的地方验证本地颁发的证书。除了本地CA链证书(CER,PEM,CRT)之外,我还有本地颁发的证书(PEM和CRT)。根和颁发者是同一台服务器。比较两
我正在使用 protobuf 自动生成我的 API 服务,在 gRPC 中技术,在我的安卓客户端。自从我一直在毫无问题地工作以来,已经过去了几个月。现在突然之间,AndroidRuntime Veri
我们目前正在使用“mvn clean verify”在 Hudson 上运行我们的持续构建。这就是我们一直在做的,所以我们从不质疑它。 问题是:仅使用“mvn verify”运行连续构建是否安全?因此
我已经在我的虚拟机上安装了 redis。然后我运行命令 [root@vm001jeguan ~]# rladmin help verify 它显示以下错误: [root@dltasvm001jegua
我正在使用以下应用链接:https://developer.android.com/training/app-links/verify-site-associations 使用cmd时:adb she
我写了一个应用程序,我想在网上销售它,所以我把它上传到我的网站,并试图下载并运行它作为测试,但出现了一个窗口,它说:“无法验证发布者。你确定吗?要运行此软件吗?”,并且还说:“发布者:未知发布者”。它
我们正在迁移与Kotlin接触的类,因此我们需要在Java测试类中模拟Kotlin类。我们使用io.mockk:mockk:1.9.3。 为了至少验证x次,我们有一个包装器方法 public stat
在完全更新的 XCode 4.6(以及之前的 4.5)中,构建过程的“验证应用程序”步骤在我的机器上通常需要两分钟以上的时间。在类似计算机上构建相同应用程序的同事只需几秒钟即可完成此步骤。在过去的几个
它在 documentation 中说 构建生命周期中的验证阶段 run any checks on results of integration tests to ensure quality cr
我有一个模拟对象,正在验证一些调用的东西。但想知道 MockedObject.Verify(thingToBeVerified) 的默认参数是什么? 是 Times.Zero、Times.Once 还
谁能向我解释一下每种用户类型(荣誉、已验证、审核和员工之间的区别)他们的角色? (对每个用户及其可以执行的操作的简要说明)。 我查了官方文档,但没有找到! 谢谢。 最佳答案 Honor 用户会自动注册
我正在编写一个 Chrome 扩展,其中内容脚本向后台脚本发送消息。 chrome.runtime.sendMessage({greeting: "hello"}, function(response
我在编写测试时已经习惯了遵循代码模式 public void TestMethod_Condition_Output() { //Arrange---------------- Moc
我有以下代码: class Foo { public Foo() { Size = true; } private bool _size; pr
我有以下代码,取自 ShowSignature来自 PDFBox 2 的示例。我正在运行五个测试,其中调用了它,其中 4 个测试顺利通过(无签名、单签名、双签名、过期签名),但第五个测试是椭圆曲线,但
我正在尝试mockito.verify()功能,该方法仅调用一次,但verify显示调用3次。单元测试只有一个测试,以确保该测试不会受到其他影响。Mockito.verify(utilClass, M
摆弄 Mockito 来实现我的服务的单元测试,但出于某种原因,我无法通过我厚实的头骨来完成它。我的测试通过了,但我不相信我做对了。 这是我测试 count() 方法的示例。该方法只是将调用转发到其存
我是一名优秀的程序员,十分优秀!