iOS watchdog (看門狗機制)

前言

為了防止一個應用占用過多的系統(tǒng)資源弃秆,蘋果設計了一個“看門狗”( watchdog )的機制届惋。在不同的場景下,“看門狗”會監(jiān)測應用的性能菠赚。如果超出了該場景所規(guī)定的運行時間脑豹,“看門狗”就會強制終結(jié)這個應用的進程。開發(fā)者們在 crashlog 里面衡查,會看到諸如 0x8badf00d 這樣的錯誤代碼瘩欺。異常代碼:“ 0x8badf00d ”,即“ ate bad food ”。

蘋果開發(fā)文檔原文

The exception code 0x8badf00d indicates that an application has been terminated by iOS because a watchdog timeout occurred. The application took too long to launch, terminate, or respond to system events. One common cause of this is doing synchronous networking on the main thread.
Whatever operation is on Thread 0 needs to be moved to a background thread, or processed differently, so that it does not block the main thread.

大致意思是說:如果我們的應用程序?qū)σ恍┨囟ǖ腢I事件(比如啟動俱饿、掛起歌粥、恢復、結(jié)束)響應不及時拍埠,Watchdog 會把我們的應用程序干掉失驶,并生成一份響應的 crash 報告。

遇到的問題

應用 100% Loss 時完全無法啟動械拍,一直崩潰突勇。徹底切斷網(wǎng)絡連接正常啟動,調(diào)試模式狀態(tài)下等待時間非常久坷虑,但可以啟動甲馋,并伴隨 UI 微卡。強烈的預感這是線程阻塞迄损。

:用 Xcode debugwatchdog 并不運行定躏,一定要把設備從 Xcode 斷開來測試啟動速度。

原因

首先看了 crash log芹敌,就像猜測的那樣痊远,的確是卡在了主線程;意料之外的是氏捞,無數(shù)次閃退只留下了一份崩潰日志碧聪,如下所示:


第一次見,讀了一些資料大概才算是明白了這是怎么一回事液茎。為了避免應用陷入錯誤狀態(tài)導致界面無響應逞姿,Apple 設計了看門狗 (WatchDog) 機制。一旦超時捆等,強制殺死進程滞造。在不同的生命周期,觸發(fā)看門狗機制的超時時間有所不同:

首先說一說異常編碼栋烤,也是寓意頗深谒养。8badf00d = ate bad food,大概是在說看門狗吃了壞的食物所以暴走了明郭?买窟!異常記錄則表示這并不是一次崩潰(邪魅一笑:強制退出而已)。信息一欄指出時間限制為 20 s达址。結(jié)合應用業(yè)務來看蔑祟,表層原因在于:每次啟動應用,首先進行一次模版同步沉唠,在此之前需要檢測登錄狀況疆虚,通過 RunLoop 反復嘗試直到收到響應為止。然而不幸的是,這一些都發(fā)生在主線程径簿。

同步網(wǎng)絡請求罢屈,主線程,超長超時時間篇亭,滿足這三點缠捌,一定場景下幾乎必然會觸發(fā)看門狗機制。

對策

合理解決方案:

  1. 異步網(wǎng)絡請求:優(yōu)點很多译蒂,最重要的是可以讓你無憂無慮安全地訪問網(wǎng)絡曼月,而無需擔心線程。

  2. 在非主線程中使用同步網(wǎng)絡請求:如果異步運行你的網(wǎng)絡代碼比登天還難的話(也許你的應用是一個基于同步網(wǎng)絡請求的大型移植項目)柔昼,退而求次哑芹,你也可以在次級線程中運行同步代碼,也可以避免觸發(fā)看門狗機制捕透。

此外聪姿,一部分情況下,例如這次遇到登錄和模版同步時觸發(fā)看門狗乙嘀,事實上末购,即使在運用到模版時再次請求也是勉強可行的,因此姑且先跳過網(wǎng)絡請求也可以虎谢。此時盟榴,還以使用一種我認為是相對比較差的方案:

  1. 通過 RunLoop 來操控一切,一旦超過既定的超時時間婴噩,就提示用戶重試或者暫時先跳過網(wǎng)絡請求曹货。

應用的網(wǎng)絡部分基于公司的通用框架,因此優(yōu)先考慮在非主線程中進行網(wǎng)絡請求來避免觸發(fā)看門狗讳推。
至于調(diào)試模式下為什么可以正常啟動應用,完全是因為該模式下看門狗機制處于禁用狀態(tài)玩般。
此外银觅,除了網(wǎng)絡操作,I/O 讀寫文件和大規(guī)模運算等耗時任務也極有可能觸發(fā)看門狗機制坏为。合理處理線程究驴,優(yōu)化耗時任務,很大程度能避免不佳用戶體驗匀伏。

Author

如果你有什么建議洒忧,可以關(guān)注我,直接留言够颠,留言必回熙侍。

參考文章

主線程上的同步網(wǎng)絡請求
調(diào)試模式不發(fā)生崩潰
iOS的看門狗(watchdog)機制
iOS的看門狗機制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛉抓,更是在濱河造成了極大的恐慌庆尘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷送,死亡現(xiàn)場離奇詭異驶忌,居然都是意外死亡,警方通過查閱死者的電腦和手機笑跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門付魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飞蹂,你說我怎么就攤上這事几苍。” “怎么了晤柄?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵擦剑,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么亥宿? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任撑帖,我火速辦了婚禮,結(jié)果婚禮上忧陪,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好售担,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著署辉,像睡著了一般族铆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哭尝,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天哥攘,我揣著相機與錄音,去河邊找鬼材鹦。 笑死逝淹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的桶唐。 我是一名探鬼主播栅葡,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尤泽!你這毒婦竟也來了欣簇?” 一聲冷哼從身側(cè)響起规脸,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醉蚁,沒想到半個月后燃辖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡网棍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年黔龟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滥玷。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡氏身,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惑畴,到底是詐尸還是另有隱情蛋欣,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布如贷,位于F島的核電站陷虎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杠袱。R本人自食惡果不足惜尚猿,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楣富。 院中可真熱鬧凿掂,春花似錦、人聲如沸纹蝴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塘安。三九已至糠涛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兼犯,已是汗流浹背脱羡。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留免都,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓帆竹,卻偏偏與公主長得像绕娘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栽连,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容