美文网首页
一种SDK crash 定位方案

一种SDK crash 定位方案

作者: 牧马 | 来源:发表于2019-06-06 17:44 被阅读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

    相关文章

      网友评论

          本文标题:一种SDK crash 定位方案

          本文链接:https://www.haomeiwen.com/subject/atnbgqtx.html