iOS监控笔记之启动crash-创新互联

前言

专注于为中小企业提供做网站、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业衡南免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

相较于正常的崩溃问题,启动crash造成的损失要远远大得多。正常来说,如果有足够强健的构建发布系统,大多数时候能在版本上线之前及时发现问题并且修复,但是仍然存在小概率的线上意外。启动crash一般同时具备损害严重以及难以捕获两大特点

启动过程

从应用图标被用户点击开始,直到应用可以开始响应发生了很多事情。正常来说,尽管我们希望crash监控工具启动的尽可能早,但接入方往往总是等到launch事件之后才能启动工具,而在这个时间之前发生的崩溃就是启动crash,下面列出了在应用直到launch时,存在的可能发生启动crash的阶段:

iOS监控笔记之启动crash

其中initialize的顺序可能在更早,但总是会在load和launch之间。从图中来说,如果我们想要监控启动crash,那么开始监控的时间点必须要放到load阶段,才能保证最好的监控效果

如何监控

最简单的方式是不管接入方愿不愿意启动crash监控,我们在load方法中直接启动监控功能。但是这样的做法会让应用面临四个风险点:

  • 类似A/B的线上开关方案失去了对监控工具的控制能力
  • crash监控启动存在崩溃问题,这将导致应用完全瘫痪
  • load阶段类未加载完毕,启动工具过程的递归加载引发的崩溃无法监控

综合这些风险点,启动crash监控的方案应该满足这些条件:

  • 启动过程不依赖类,避免递归加载造成的crash
  • 一旦过程发生crash,能够保证日志记录的安全性

最终得出监控的流程图:

iOS监控笔记之启动crash

不依赖类

不依赖类意味着监控工具需要使用C接口来实现功能,虽然比较麻烦,但由于runtime的机制决定了所有方法调用最终要以objc_msgSend函数作为入口,因此如果能够hook掉这个函数并且实现一个调用栈结构,将所有调用入栈记录,那么追踪方法调用就不是难事。fishhook提供了hook掉函数的能力:

__unused static id (*orig_objc_msgSend)(id, SEL, ...);

__attribute__((__naked__)) static void hook_Objc_msgSend() {
 /// save stack data
 /// push msgSend
 /// resume stack data
 
 /// call origin msgSend
 
 /// save stack data
 /// pop msgSend
 /// resume stack data
}

void observe_Objc_msgSend() {
 struct rebinding msgSend_rebinding = { "objc_msgSend", hook_Objc_msgSend, (void *)&orig_objc_msgSend };
 rebind_symbols((struct rebinding[1]){msgSend_rebinding}, 1);
}

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网站名称:iOS监控笔记之启动crash-创新互联
转载注明:https://www.cdcxhl.com/article36/spgsg.html

成都网站建设公司_创新互联,为您提供自适应网站手机网站建设标签优化网站改版小程序开发静态网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设