前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈第三方 SDK 和自定义 crash 上报冲突问题

浅谈第三方 SDK 和自定义 crash 上报冲突问题

作者头像
s_在路上
发布2018-09-30 10:56:49
1.8K0
发布2018-09-30 10:56:49
举报
文章被收录于专栏:iOS 开发杂谈iOS 开发杂谈

简介

在开发 iOS 应用,解决 Crash 问题始终是一个难题。Crash 分为两种,一种是由 EXC_BAD_ACCESS 引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存;另一种是未被捕获的 Objective-C 异常,导致程序向自身发送了 UNIX 信号而崩溃。对于这两种 Crash 的捕获,精准高效的收集线上崩溃可以帮助我们更好的解决问题和提高用户体验,现在比较成熟的崩溃收集工具也比较多,比如:友盟统计,Crashlytics,腾讯的 bugly 等等。也可以通过自定义 crash 上报,来处理异常。

问题

但是当自定义 crash 上报收集工具与第三方 crash 收集工具共存的时候,发现自定义 crash 上报收集工具,不能捕获到 exception

原因

代码语言:javascript
复制
/* Set the uncaught exception handler */
NSSetUncaughtExceptionHandler(&uncaught_exception_handler);

不管是第三方还是自定义的上报收集工具,一般会常用注册 ExceptionHandler 的方式,来捕获 exception,但是并没有将异常进行抛出,所以,当工程中使用了第三方上报收集工具进行异常统计的时候,我们自己写的异常捕获有可能会失效。

解决方法

首先保存第三方的 ExceptionHandler,然后在设置自己处理 exceptionExceptionHandler,在自己的 ExceptionHandler 处理完异常之后,再将异常塞给之前的第三方 ExceptionHandler

代码语言:javascript
复制
static NSUncaughtExceptionHandler *_previousHandler;
 // 保存第三方处理异常的 handler
 _previousHandler = NSGetUncaughtExceptionHandler();
 // 设置自己处理异常的 handler 
 NSSetUncaughtExceptionHandler(&UncaughtExceptionHandlerYourself);

处理自己的异常

代码语言:javascript
复制
void UncaughtExceptionHandlerYourself (NSException *exception) {
}

处理完自己的逻辑之后就需要把 exception 赋值给我们之前保存的handler,否则第三方就无法统计到崩溃的数据。

代码语言:javascript
复制
_previousHandler(exception);

总结,通过这种方法,第三方和我们上报收集工具,都可以正常的收集崩溃数据。第三方上报收集工具捕获到异常,再处理完自己的逻辑后,将 exception 抛了出来,我们自己的崩溃日志收集库收到第三方上报收集工具抛出来的 exception,处理完自己的逻辑后再将 exception 抛给第三方上报收集工具的 handler

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 问题
  • 原因
  • 解决方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档