背景

应用 100% Loss 时完全无法启动,一直崩溃。彻底切断网络连接正常启动,调试模式状态下等待时间非常久,但可以启动,并伴随 UI 微卡。强烈的预感这是线程阻塞。前一段时间被 Core Data Concurrency 折腾的够呛,看见线程问题就略有些心慌。

原因

首先看了 crash log,一如猜测,的确是卡在了主线程;意料之外的是,无数次闪退只留下了一份崩溃日志,如下所示:

Watch Dog

第一次见,读了一些资料大概才算是明白了这是怎么一回事。为了避免应用陷入错误状态导致界面无响应,Apple 设计了看门狗 (WatchDog) 机制。一旦超时,强制杀死进程。在不同的生命周期,触发看门狗机制的超时时间有所不同:

生命周期 超时时间
启动 Launch 20 s
恢复 Resume 10 s
悬挂 Suspend 10 s
退出 Quit 6 s
后台 Background 10 min

首先说一说异常编码,也是寓意颇深。8badf00d = ate bad food,大概是在说看门狗吃了坏的食物所以暴走了?!异常记录则表示这并不是一次崩溃(邪魅一笑:强制退出而已)。信息一栏指出时间限制为 20 s。结合应用业务来看,表层原因在于:每次启动应用,首先进行一次模版同步,在此之前需要检测登录状况,通过 RunLoop 反复尝试直到收到响应为止。然而不幸的是,这一些都发生在主线程。

同步网络请求,主线程,超长超时时间,满足这三点,一定场景下几乎必然会触发看门狗机制。

对策

合理解决方案:

  1. 异步网络请求:优点很多,最重要的是可以让你无忧无虑安全地访问网络,而无需担心线程。
  2. 在非主线程中使用同步网络请求:如果异步运行你的网络代码比登天还难的话(也许你的应用是一个基于同步网络请求的大型移植项目),退而求次,你也可以在次级线程中运行同步代码,也可以避免触发看门狗机制。

此外,一部分情况下,例如这次遇到登录和模版同步时触发看门狗,事实上,即使在运用到模版时再次请求也是勉强可行的,因此姑且先跳过网络请求也可以。此时,还以使用一种我认为是相对比较差的方案:

  1. 通过 RunLoop 来操控一切,一旦超过既定的超时时间,就提示用户重试或者暂时先跳过网络请求。

应用的网络部分基于公司的通用框架,因此优先考虑在非主线程中进行网络请求来避免触发看门狗。

至于调试模式下为什么可以正常启动应用,完全是因为该模式下看门狗机制处于禁用状态。

此外,除了网络操作,I/O 读写文件和大规模运算等耗时任务也极有可能触发看门狗机制。合理处理线程,优化耗时任务,很大程度能避免不佳用户体验。

参考:

  1. 主线程上的同步网络请求
  2. 调试模式不发生崩溃

iOS 的看门狗机制相关推荐

  1. iOS- Exception Type: 00000020:什么是看门狗机制

    1.前言    前几天我们项目闪退之后遇到的一个Crash,之后逛了许多论坛,博客都没有找到满意的回复  在自己做了深入的研究之后,对iOS的看门狗机制有了一个基本的了解  而有很多奇怪的Crash可 ...

  2. iOS- Exception Type: 00000020:什么是看门狗机制(转)

    1.前言 前几天我们项目闪退之后遇到的一个Crash,之后逛了许多论坛,博客都没有找到满意的回复 在自己做了深入的研究之后,对 iOS的看门狗机制有了一个基本的了解 而有很多奇怪的Crash可能恰恰就 ...

  3. MTK 驱动开发(48)---ARM 看门狗机制

    ARM 看门狗机制 [包括MTK] SYS_LAST_KMSG里的hw_status和fiq step的含义 阅读数:559 [DESCRIPTION] SYS_LAST_KMSG这支文件是记录上次重 ...

  4. iOS-watchdog看门狗机制

    背景 应用 100% Loss 时完全无法启动,一直崩溃.彻底切断网络连接正常启动,调试模式状态下等待时间非常久,但可以启动,并伴随 UI 微卡.强烈的预感这是线程阻塞.前一段时间被 Core Dat ...

  5. 整合redisson了解分布式锁的配置熟悉lock的看门狗机制以及应用

    java相对主流分布式锁 - redis的Redisson (Java implementation) the Redlock 设计 1.引入依赖 <!-- https://mvnreposit ...

  6. redisson中的看门狗机制总结

    1:普通的Redis分布式锁的缺陷 我们在网上看到的redis分布式锁的工具方法,大都满足互斥.防止死锁的特性,有些工具方法会满足可重入特性.如果只满足上述3种特性会有哪些隐患呢?redis分布式锁无 ...

  7. ARM 看门狗机制 [包括MTK] 【1】

    watchdog一般是一个硬件模块(其实可以当做是一个定时器),其作用是,在嵌入式操作系统中,很多应用情况是系统长期运行且无人看守,导致程序跑飞,所以难免怕万一出现系统死机,那就悲剧了,这时,watc ...

  8. redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制

    Redisson简介 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式 ...

  9. Redisson的看门狗watchDog机制是怎么实现的?

    文章目录 INFO 一.回顾 二.WatchDog 1.啥意思 2.原理 三.总结 INFO 作者: 编程界的小学生 日期: 2021/09/09 修订: 初版,未修订.2021/09/09 版权: ...

最新文章

  1. nagios不能 发送飞信报警一例
  2. 人脸检测--FaceBoxes: A CPU Real-time Face Detector with High Accuracy
  3. CentOS 7如何设置Linux开机自动获取IP地址
  4. scala typetag java,scala – 从类型中获取TypeTag?
  5. 数据结构源码笔记(C语言):基数排序
  6. RabbitMQ简介以及应用
  7. SQL的3个主要组成
  8. python锁有哪几种_python 可重入锁有什么用?
  9. 再现神人!仅仅只花4天半就解开了史上最难密码,这下整个圈子都炸开了.........
  10. Flowable 数据库表结构 ACT_RU_TASK
  11. 用jQuery实现一些导航条切换,显示隐藏
  12. macOS Docker 上安装、启动 MySQL
  13. Unix 激荡 50 年:驱动 Android、iOS 的操作系统是如何从失败开始的?
  14. idea 调整缩进快捷键_IDEA 代码格式化,快捷键
  15. 属性动画实现卫星菜单效果
  16. 定义fact(n)函数,调用函数,返回值
  17. 半实物仿真技术在复杂控制系统研发过程中的典型应用
  18. python 不转义:含有转义字符\的字符串
  19. WorldQuant因子分析复现
  20. 京东API开发系列:京东按关键字搜索商品 API / item_search - 按关键字搜索商品 API返回值说明

热门文章

  1. 【Linux 用户和组】基础概念
  2. 基于Python实现的费诺编码
  3. PLC SECS/GEM解决方案,设计与应用
  4. 计算机语言栏在哪里,缺少计算机语言栏的解决方案是什么
  5. 广东电信公话200专用话机话务动态分析系统的构建
  6. 鸿蒙系统网络连接设置ip,G1 IP话机网络配置和话机设置
  7. dnf 计算机管理,怎么让dnf变得更流畅 让游戏不卡的几个办法
  8. 中南大学python程序设计实践_学院承办的第三届“全国高校Python语言与计算生态教学研讨会”圆满召开...
  9. 使用TeXpad iOS实现移动办公(二)
  10. CISSP 考试知识要点总结