你的 App 在 iOS 13 上被卡死了吗?
作者 | 王晓晖、邓竹立、朴惠姝
信号类型 | 信号解释 |
SIGSEGV | 无效的内存地址引用信号,试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据。 |
SIGILL | 执行了非法指令,通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。 |
SIGABRT | 通常由于异常引起的中断信号,异常发生时系统会调用abort()函数发出该信号。 |
SIGBUS | 非法地址, 包括内存地址对齐(alignment)出错。与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。 |
SIGKILL | 用来立即结束程序的运行,该信号不能被阻塞、处理和忽略。 |
在iOS11.0到iOS11.2以前系统手机在前台收到推送后进入后台被杀死或可能会在前台杀死。
开启任务后做了大量耗时操作无法任务结束。
系统挂起beginBackgroundTask方法回调中没有关闭后台任务或添加两次或两次以上的回调无法一对一关闭后台任务。
开启任务后在到期事件处理的回调中开启子线程进行大量耗时操作等等。
对App的影响范围
OpenUDID的使用现状调研
SDK | OpenUDID类名 | 是否修改了 | 启动注册是否调用 |
滴滴打车 | DIOpenUDID | 否 | 否 |
讯飞 | IFlyOpenUDID | 否 | 否 |
微博 | WBSDKOpenUDID | 是(只修改了私有剪贴板标识,还是会访问100次剪贴板) | 否(但初始时会触发一次剪贴板的调用) |
支付宝 | UTDIDOpenUDID | 是(仅在App首次启动时会触发100次访问剪贴板的逻辑) | 否 |
微信 | WXOMTAOpenUDID | 是(不会触发100次访问剪贴板逻辑) | 否(但初始化时会触发一次剪贴板的调用) |
头条广告 | BUOpenUDID | 是(不会触发100次访问剪贴板逻辑) | 否 |
百度地图 | -- | -- | -- |
ZBar | -- | -- | -- |
听云 | -- | -- | -- |
首先这个问题很可能是一个由系统UIPasteboard接口与OpenUDID开源代码共同影响而引起的系统性问题。 因为UIPasteboard的相关接口是进程间同步的,一旦UIPasteboard在某一极端情况下被卡死,所有App在主线程调用UIPasteboard接口的操作都会被卡死。所以应当避免在App生命周期函数中调用UIPasteboard接口的操作。 OpenUDID最初的目的是在不同App中共享私有剪贴板来确保其UDID值唯一不变,但是随着iOS系统对这一特性的封锁,这段代码已经失去了之前的意义。为了降低系统剪贴板卡死的概率,建议修改OpenUDID关于剪贴板相关的这部分逻辑。
《信号 (LINUX信号机制)》:https://baike.baidu.com/item/%E4%BF%A1%E5%8F%B7/7927794?fr=aladdin
《iOS开发socket程序被SIGPIPE信号Terminate的问题》https://blog.51cto.com/arthurchen/736181
OpenUDID源码地址:https://github.com/ylechelle/OpenUDID
《58crash日志解析方案介绍》:https://www.jianshu.com/p/70985e61f9c5
热 文 推 荐
☞12306 回应软件崩了;微信发布新版本,朋友圈可“斗图”;Ant Design 3.26.4 发布 | 极客头条
☞2019 十大国产开源项目来势汹汹!☞滴滴开源在2019:十大重点项目盘点,DoKit客户端研发助手首破1万Star
☞阿里内部鄙视链!!!