ios9.0的系统bug导致的objc_msgSend错误的解决方案
发布网友
发布时间:2023-04-23 02:30
我来回答
共1个回答
热心网友
时间:2023-04-27 17:56
看此篇文章之前请先阅读 xcode调试效率 .
ios9.0上遇到一个问题, UITableView 中长按 section ,如果我们的交互中要求弹出menu菜单,那么就会出现如图所示的必现崩溃
1.这个NSDictionary到底是什么?是 UITableView 的数据源吗?
2.如果是数据源是否是多线程导致的呢?( NSDictionary 在多线程下如未处理好极容易崩溃, set 和 get 同时调用的时候,一个对象被 remove 之后野指针了,然后 get 操作会立马导致崩溃)
1.由于工程比较大,建议先写一个demo去做。(大工程的一些配置选项可能导致 lldb 的某些命令无法使用),这一点耗费了我们很大的精力去分析 NSZombie 的 malloc 历史,都没有结果
在工程中拆分出demo之后,由于我们根本没有 NSDictionary ,所以排除了这种情况,但是为什么会有这个问题呢。这个 NSDictionay 又是什么呢?
通过条件断点我们查看最后一次调用的地方,然后打印当前寄存器的值
通过
我们可以去找到rdi,这个返回参数。此时去找这个参数的地址
CFDictionaryCreateMutable 是关键方法,通过它我们知道了如何去分配对象,理想当然,我们得去找到系统的 CFDictionary ,这时候会发现有一个 CFDictionarySetValue 的方法
要截获 CounFoundation 库的C方法,普通的oc的 swizzle 当然是做不到的,但是幸好有 * 提供的 fishhook , fishhook 原理可以参照 iOS安全攻防(十七):Fishhook .
我们现在来截获一把,
这样我们就不会崩溃了。
整个事情的来龙去脉已经清楚了,这里提供了只是提供一个思路去解决问题。但是实际开发中不推荐这么去做,这个方法会对app性能有影响,建议用 UIButton 去模拟规避这个问题。
demo
1. iOS安全攻防(十七):Fishhook
2. lldb官方命令大全