设计背景与需求:
背景:在制作sdk时,往往由于接入方APP为第三方厂家,一旦sdk发生崩溃,存在反馈crash不及时,dsym文件无法获取等问题导致crash本身也难以解析。
需求:需要在代码中动态判断当前crash是否是目标sdk导致,自动上报crash达到自动预警的能力。
需要解决的问题?
异常/崩溃的捕获,且不干扰其他异常捕获的处理【略】
无符号表的情况下,如何判定堆栈中是否有目标sdk的代码?
Pod库是否也可以做到
通过协议统一实现方案,方便迁移
动态库 & 静态库
动态库有库的名称,可以直接判定是否在目标sdk中
静态库由于SDK和APP代码属于同一个二进制块,不容易判断
函数地址
异常捕获到的堆栈中,提取到崩溃栈的地址信息
如何确定地址在目标sdk中?
1 拿到崩溃栈中地址信息
2 判断地址是否落在SDK中
如何获取目标sdk函数的地址区间
所加载的静态库通过MachOView 工具可以看到是一段连续地址
因此只需要拿到目标sdk的第一个函数地址和最后一个函数地址,就得到了函数地址区间
在Compile Sources 的文件列表中第一个.m文件写一个函数返回该函数地址,此地址即是sdk的第一个函数地址
同理,可以获取到sdk的最后一个函数地址
Pod库如何确保取首位地址正确
暂未发现podspec有设置 sources 文件顺序的方法,通过尝试发现pod生成的target配置中,sources是根据文件名进行字典排序。
通过文件命名,来确保 XXBegain.m和XXEnd.m 一定在收尾引入。
需要注意ASLR机制
Release版本由于ASLR技术会无法直接在崩溃栈中获取到偏移后的地址,需要以下方法获取偏移地址
网友评论