一种SDK crash 定位方案

2019-06-06  本文已影响0人  牧马

设计背景与需求

背景:在制作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技术会无法直接在崩溃栈中获取到偏移后的地址,需要以下方法获取偏移地址


参考资料

iOS崩溃日志分析:https://www.jianshu.com/p/7958ba264c81

SDK函数地址区间获取:https://github.com/hssdx/sdk-crash

上一篇下一篇

猜你喜欢

热点阅读