iOS-watchdog看门狗机制

背景

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

原因

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


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


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

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

对策

合理解决方案:

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

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

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 同步:ckitakishi.com 背景 应用 100% Loss 时完全无法启动,一直崩溃。彻底切断网络连接正常...
    晨行北岸阅读 7,319评论 2 11
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,412评论 1 14
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,865评论 6 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 1.今日对接客户发广告。有些单子没能定下来。定下来的有近期王星的团、滑雪营的团、和莱芜的团。 2.今天中午跟着旅行...
    鹿斌1阅读 173评论 0 0