精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS App 后臺任務的坑

移動開發
大多數 iOS App 在進入后臺之后都會將一些關鍵任務封裝到 Background Task 里,否則程序在若干秒之后就會被系統 Suspend。啟動 Background Task 之后,可以獲得 3 分鐘繼續執行代碼的時間。

大多數 iOS App 在進入后臺之后都會將一些關鍵任務封裝到 Background Task 里,否則程序在若干秒之后就會被系統 Suspend。啟動 Background Task 之后,可以獲得 3 分鐘繼續執行代碼的時間。

最近在調查 Messenger 的 Background Crash 問題,最后都追蹤到和 Background Task 相關,和大家分享下一些要點。

iOS App 后臺任務的坑

Crash 信號

一般 App 都有自己的 crash 日志采集工具,這類工具一般有三個問題。第一是在工具啟動之前的 crash 日志無法捕捉,第二是如果 App 啟動閃退日志無法上傳,第三是一些特殊場景的系統強殺無法捕捉 crash 信號。

  • 解決第一個問題,只要將工具的執行時間盡可能提前,或者確保之前的代碼及可能簡單可靠。
  • 解決第二個問題,可以采用我之前分享過的,使用 NSURLSession 的 background mode。
  • 解決第三個問題,需要依賴于 Apple 自己的 crash 信號,這也是很多開發團隊所忽視的一點。

Apple 也有自己的 crash 日志采集,不過基于用戶隱私的考慮,這個 crash 日志并不可靠,主要存在以下幾方面的缺陷:

  • 用戶需同意上傳并分享數據,據聞,同意比例不足 20%,所以無法準確確定某個 crash 的實際影響面。
  • crash 日志工具簡陋,通過 Xcode -> Organizer 打開,選中 App 就能從 Apple 后臺下載某個版本的 crash 日志,無法通過某個條件做篩選,比如你不能過濾出所有 SIGKILL 的日志。
  • 日志不全,Apple 按照自己的規則呈現 crash 樣本,一個 App 實際線上的 crash 非常之多,但 Apple 列出的 crash 樣本只有數十個,規則不明。
  • crash 日志只保存一周,一周刷新一次,所有比較明智的做法是寫個腳本同步下來,上傳到自己的后臺。

Background Task 花式 crash

Background Task 的 API 及其簡單,begin 和 end 之間的代碼全部進入 Background Task 的范疇。但簡單的代碼隱藏著不小的風險,下面列出三個比較容易出現的 crash。而且這三個 crash 都是客戶端自帶的 crash 采集工具無法捕捉的,只能通過 Apple 的 crash 日志獲得信號。原因很簡單,這些 crash 發生的時候 app 一般處于 suspend 狀態,根本沒有機會執行任何代碼,系統直接發送 SIGKILL 信號后就將 app 強殺,并生成一個系統日志,一個只能 Apple 訪問的日志,還得用戶先同意上傳分享。

0xdead10cc

這個 crash 日志一般長這樣:

 

  1. Exception Type:  EXC_CRASH (SIGKILL)  
  2. Exception Codes: 0x0000000000000000, 0x0000000000000000  
  3. Exception Note:  EXC_CORPSE_NOTIFY  
  4. Termination Reason: Namespace SPRINGBOARD, Code 0xdead10cc  
  5. Termination Description: SPRINGBOARD, com.xxx.xxx was task-suspended with locked system file 

原因我之前介紹過,當你的 App 有 Extension,而且 Extension 存在和 Host App 共享數據的需求,一般做法會將 db 文件放入 shared container 目錄下,此時你的 App 就有大概率會發生這種 crash。

App 進入后臺運行 Background Task,end 之后 App 被系統 suspend,如果 suspend 之后還存在任何訪問 db 的操作,此時 App 會立馬被系統強殺,這是 Apple 出于保護數據庫文件的完整的考慮。

所以正確的做法是將所有有可能在 App 進入后臺之后,還會發生的 db 操作統統封入 Background Task,以確保安全。這個代碼寫在 db layer 可能更加合適。

而且 Apple 推薦當你想啟動 Background Task 的時候,其實并不需要考慮當前 App 是出于 foreground 還是 background,即使 App 在前臺啟動 Background Task,也并不會占用進入后臺之后 3 分鐘額度,所以放心大膽的把關鍵代碼放進 Background Task 吧。

0xbada5e47

當你聽從了上面的建議,大大方方的把盡可能多的關鍵代碼封入 Background Task 后,那么你可能會遇到下面的 crash:

 

  1. Exception Type: EXC_CRASH (SIGKILL)  
  2. Exception Codes: 0x0000000000000000, 0x0000000000000000  
  3. Exception Note: EXC_CORPSE_NOTIFY  
  4. Termination Reason: Namespace ASSERTIOND, Code 0xbada5e47 

同理也是和 Background Task 相關,原因是 Apple 認為你啟動了過多的 Background Task,所以要殺掉。多少算多呢?幾十個不多,當前的 threshold 是 1000 個,超過 1000 個才會強殺。如果你的 Background Task 封裝發生在 db layer,出現大量數據過來需要存儲或讀取的時候,還是有可能會 hit 這個 limit。

另一個 0xbada5e47 的可能原因是,Background Task 在超時之后會調用 expiry handler,無論你有多少個 Background Task,所有 expiry handler 執行的時間不能超過若干秒,一旦超過也會被槍殺。所以在 expiry handler 里面切忌有任何比如 disk io 的耗時操作。

0x8badf00d

說到 0x8badf00d,大家都很熟悉了,當你的主線程卡住的時間太長,系統的 Watchdog 會將你的 App 強殺,并生成一個帶有 0x8badf00d 的 crash 日志。

Background Task 其實也可以 0x8badf00d 的,比如:

 

  1. Exception Type:  EXC_CRASH (SIGKILL)  
  2. Exception Codes: 0x0000000000000000, 0x0000000000000000  
  3. Exception Note:  EXC_CORPSE_NOTIFY  
  4. Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d 

當你的代碼邏輯會產生 leaked Background Task 時,就會出現上面的系統強殺 crash 日志了,什么是 leaked Background Task 呢?看代碼:

  1. - (void)startBgTask 
  2.  self.bgTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
  3.    NSLog(@"Expired: %lu", (unsigned long)self.bgTaskID); 
  4.    [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskID]; 
  5.  }]; 
  6.  
  7. - (void)endBgTask 
  8.  [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskID]; 

上面的代碼如果 startBgTask 執行兩次,就一定會出現 leaked Background Task,因為 self.bgTaskID 第二次會被賦予一個新的 ID,之前的 task ID 就丟失了,無法正確調用 end。

那怎么判斷 0x8badf00d 到底是主線程卡死,還是出現了 leaked Background Task ?很簡單,看主線程的 stack,如果長這樣:

 

  1. Thread 0 Crashed:0    
  2.  
  3. libsystem_kernel.dylib        0x000000018472be08 0x18472b000 + 35921     
  4. libsystem_kernel.dylib        0x000000018472bc80 0x18472b000 + 32002   
  5. CoreFoundation                0x0000000184c6ee40 0x184b81000 + 9744003 
  6. CoreFoundation                0x0000000184c6c908 0x184b81000 + 9648724 
  7. CoreFoundation                0x0000000184b8cda8 0x184b81000 + 485525   
  8. GraphicsServices              0x0000000186b6f020 0x186b64000 + 450886    
  9. UIKit                          0x000000018eb6d78c 0x18e850000 + 32664447   
  10. Messenger                      0x0000000103015ee4 0x102ff8000 + 1225968  
  11. libdyld.dylib                  0x000000018461dfc0 0x18461d000 + 4032 

這個 stack 很經典,經常會看到,不需要 symbolicate 也能知道是干啥,這是 UI 線程 runloop 處于 idle 狀態的 stack,在等待 kernel 的 message。表示 UI 線程此時處于閑置狀態,這種狀態下的系統強殺大概率是由于 leaked Background Task 導致的。

善用設備本地的 crash 日志

當用戶的手機遇到 crash,而你既無法重現又在后臺找不到 crash 日志的時候,此時你最大的希望就是手機本地的 crash 日志了。

本地日志位于 Settings -> Privacy -> Analytics -> Analytics Data。打開看下,說不定你所開發的 App 的 crash 日志,我手機上微信和支付寶都有好些日志。

日志排序先是按照 App 的名稱,再按日志發生的日期。

如果調查內存使用過多的 crash,可以查看 JetsamEvent-xxx 開頭的日志。

如果想知道 App 發生 crash 前系統有哪些異常日志,需要首先在設備上安裝一個 loggingiOS.mobileconfig 的文件,這個文件基本上就是讓用戶授權給你記錄系統行為,用戶在遇到 crash 的時候,同時按下兩個音量鍵 + 電源鍵,松手震動之后,系統會將過去一段時間的關鍵日志記錄下來,對于分析一些疑難雜癥很有幫助,這種日志一般為 sysdiagnose_xxx 開頭。

安裝上述 loggingiOS.mobileconfig 文件之后,還有另外一個好處,Apple 會記錄更多而且更詳細的 crash 日志了,因為用戶授權過,所以 Apple 可以大膽施為了。這類日志的文件名一般為:stacks + appName - date.ips。

如果用戶的設備能重現你所調查的問題,還有另一個簡單高效的辦法,將手機 usb 連接 mac,然后啟動 mac 上的 Console App,就能直觀的看到所有系統關鍵日志了,比如網絡異常日志可以查看 nsurlsessiond,定位異常日志查看 locationd,Background Task 異常日志可以查看 assertiond,也可以直接按照你 app 的進程名進行過濾,查看生命周期以及被強殺的原因。

總結

以上是最近調查 Background Task crash 的一些知識點分享,希望對大家有所幫助。

責任編輯:未麗燕 來源: MrPeak
相關推薦

2023-11-25 09:30:13

Android后臺任務

2023-11-27 19:32:25

Android

2022-01-10 09:05:32

Linux后臺命令

2009-06-19 20:38:49

Linux操作系統

2023-04-26 11:59:06

Swift異步編程

2021-10-13 07:30:13

AndroidAlarmManageWorkManager

2023-12-01 08:21:51

開發者Android組件庫

2011-12-13 20:36:26

Android

2025-04-27 08:40:00

架構后臺任務開發

2015-08-25 15:58:33

編程集錦

2013-04-12 15:59:33

2023-08-02 09:29:40

任務池TaskPool

2015-02-28 09:49:22

lua

2015-11-04 10:15:45

iOS 后臺進程監聽

2011-08-04 18:48:21

IOS 后臺

2024-01-22 08:21:46

APPHomemCount

2017-10-24 13:42:55

流氓App安卓Google

2014-05-09 12:59:26

iOS移動互聯網

2021-11-23 10:25:35

性能優化iOS App 啟動優化

2024-11-18 00:18:18

點贊
收藏

51CTO技術棧公眾號

jizz一区二区| 国产高清欧美| 日本精品一级二级| 亚洲免费精品视频| a天堂视频在线| 亚洲人成久久| 亚洲性av网站| 一区二区三区人妻| 日韩免费电影| 亚洲精品乱码久久久久久久久 | 91九色在线播放| 久久午夜羞羞影院免费观看| 国产日韩av高清| 午夜毛片在线观看| 99国产精品一区二区| 亚洲第一色在线| 做a视频在线观看| 性国裸体高清亚洲| 亚洲品质自拍视频| 秋霞久久久久久一区二区| 国产国语亲子伦亲子| 日韩国产欧美一区二区三区| 欧美高清视频在线| 麻豆视频免费在线播放| 另类图片第一页| 日韩天堂在线观看| 日韩一区二区三区不卡视频| 国产三级电影在线播放| 亚洲日本在线a| 色综合电影网| 五月婷婷丁香网| 国产成人av电影在线观看| 国产精品视频免费观看www| 97超碰人人干| 国产精品分类| 成人444kkkk在线观看| 国产传媒国产传媒| 天堂网av成人| 亚洲国产高清福利视频| 中文字幕乱码在线人视频| jizz久久久久久| 欧美在线制服丝袜| 久久久精品在线视频| sm捆绑调教国产免费网站在线观看| 成人欧美一区二区三区在线播放| 日韩免费av电影| 精华区一区二区三区| 99精品视频在线免费观看| 999视频在线免费观看| 一炮成瘾1v1高h| 奇米四色…亚洲| 日本视频久久久| av图片在线观看| 亚洲一区二区动漫| 欧美在线免费视频| 青青青国产在线| 亚洲欧美日韩视频二区| 国语自产精品视频在线看一大j8| 精品在线免费观看视频| 欧美色123| 久久久久久久久久久免费 | 亚洲三级视频在线观看| 日本一区二区免费高清视频| 午夜在线免费观看视频| 国产精品国产三级国产专播品爱网| 深夜福利成人| 国产写真视频在线观看| 亚洲欧美日韩一区二区三区在线观看| 特色特色大片在线| 日本高清成人vr专区| 亚洲自拍与偷拍| 成年人网站免费视频| 欧亚在线中文字幕免费| 色噜噜狠狠成人网p站| 免费观看精品视频| 在线一区视频观看| 欧美一区永久视频免费观看| 国产精品成人免费一区久久羞羞| 国产精品zjzjzj在线观看| 精品调教chinesegay| 91麻豆精品国产91久久综合| 四虎成人av| 欧美激情性做爰免费视频| 精品91久久久| 麻豆精品一二三| 99re国产在线播放| 蜜桃视频在线观看网站| 国产精品色哟哟网站| 久久久99精品视频| 日韩伦理在线| 欧美日韩成人综合| 日本成人在线免费| 久久综合欧美| 久久久av免费| 特一级黄色大片| 久久精品免费看| 国产欧美一区二区三区不卡高清| 高h视频在线| 亚洲美女视频在线| 女人另类性混交zo| 成人精品在线| 亚洲欧洲日韩国产| 久久99久久98精品免观看软件| 国产亚洲在线观看| 91美女福利视频高清| 欧美熟妇乱码在线一区| 中文在线一区二区| 高清在线观看免费| а天堂中文最新一区二区三区| 亚洲国产欧美一区二区三区同亚洲 | 一级片久久久久| 欧美激情性爽国产精品17p| 2019中文字幕免费视频| a天堂在线观看视频| 国产喷白浆一区二区三区| 欧美这里只有精品| 中文字幕日本一区| 亚洲男人天堂网| 国产精品1000| 精品亚洲成a人在线观看| 久久综合一区二区三区| 成码无人av片在线观看网站| 91福利精品视频| 欧美日韩人妻精品一区在线| 99精品电影| 国产精品旅馆在线| 亚洲欧美自偷自拍| 亚洲国产精品久久艾草纯爱| 久久久精品高清| 久久99蜜桃| 97视频免费看| 风流少妇一区二区三区91| 中文字幕亚洲在| 激情五月婷婷久久| 九九久久婷婷| 欧美亚洲另类在线| 亚洲 小说区 图片区 都市| 亚洲在线一区二区三区| 一级黄色片在线免费观看| 成人久久一区| 国产精品久久久久久久久久小说 | 91tv亚洲精品香蕉国产一区| 亚洲成人a**站| 久久久久久久9999| 国产成人午夜精品影院观看视频| 樱空桃在线播放| 高清不卡一区| 久久不射热爱视频精品| 国产情侣激情自拍| 中文字幕一区免费在线观看| 波多野结衣国产精品| 日韩免费看片| 国产欧美一区二区三区久久人妖| 岛国视频免费在线观看| 日本韩国一区二区三区| 欧美成人国产精品一区二区| 丝瓜av网站精品一区二区| 欧美日韩免费精品| 最新欧美电影| 中国日韩欧美久久久久久久久| 波多野结衣影片| 亚洲国产电影在线观看| 亚洲欧洲日本精品| 97精品国产福利一区二区三区| 国产精品影片在线观看| jizzjizz在线观看| 欧美精品三级日韩久久| 男女羞羞免费视频| 成人av网站在线观看免费| 免费av手机在线观看| 网友自拍一区| 国产精品久久久久av| 亚洲成a人v欧美综合天堂麻豆| 欧美精品成人一区二区三区四区| 国产极品国产极品| 成人小视频免费在线观看| 毛片在线视频播放| 欧美日韩激情| 亚洲一区二区三区香蕉| 成人福利电影| 亚洲图中文字幕| 一级特黄aaa大片| 亚洲夂夂婷婷色拍ww47| 国产精品九九九九九| 久久草av在线| 免费不卡av在线| 精品中文一区| 91夜夜揉人人捏人人添红杏| free性欧美| 国产一区二区三区网站| 国产色综合视频| 欧美日韩国产精品一区二区不卡中文 | 精品处破女学生| 国产视频在线观看一区二区三区 | 日本.亚洲电影| 久久91亚洲精品中文字幕奶水| 日韩精品福利| 在线不卡一区二区| 国产超碰人人爽人人做人人爱| 欧美高清在线精品一区| jjzz黄色片| 青娱乐精品视频| 日本丰满少妇xxxx| 欧美r级电影| 久久精品人成| 免费一级欧美在线大片| 青青在线视频一区二区三区| 黄色视屏免费在线观看| 亚洲欧美国产一区二区三区| 国产精品天天操| 色一区在线观看| 精品少妇theporn| 国产精品麻豆99久久久久久| 风间由美一二三区av片| 国产一区二区精品久久91| 欧美精品色婷婷五月综合| 欧美 日韩 国产精品免费观看| 欧美一区1区三区3区公司| 一区二区三区四区精品视频| 国产精品久久久久久久一区探花 | 爱豆国产剧免费观看大全剧苏畅| 在线综合欧美| 成人免费性视频| 亚洲天堂免费| 亚洲欧美成人一区| 自拍偷拍精品| 国产亚洲精品美女久久久m| 精品国模一区二区三区欧美 | 亚洲午夜色婷婷在线| 天堂在线观看免费视频| 日韩视频一区二区三区在线播放 | 免费在线看一区| 青青青在线播放| 亚洲精品国产日韩| 免费网站在线观看视频| 影音先锋日韩在线| 天堂v在线视频| 手机在线一区二区三区| 亚洲成人在线视频网站| 国产精品免费大片| 欧美激情第六页| 婷婷国产精品| 欧美日韩另类丝袜其他| 美女少妇全过程你懂的久久 | 最新中文字幕2018| 日韩av高清在线观看| 国产精彩免费视频| 丝袜诱惑亚洲看片| 蜜臀久久99精品久久久酒店新书| 久久精品首页| 黄色aaa级片| 美女脱光内衣内裤视频久久影院| 色婷婷成人在线| 久久综合综合久久综合| 亚洲图色中文字幕| 国产真实乱偷精品视频免| 亚洲一二区在线观看| 国产精品一区在线观看乱码| 69久久精品无码一区二区| 麻豆传媒一区二区三区| а 天堂 在线| 国产99久久久国产精品潘金网站| 人妻巨大乳一二三区| 岛国精品一区二区| 一起草在线视频| 久久久久久久久久久久久久久99| 欧美做受高潮6| 中文字幕一区二区在线播放| 欧美黄色aaa| 香蕉av福利精品导航| 久久国产视频精品| 欧美视频一区二区三区在线观看| 一本色道久久综合精品婷婷| 日韩一区二区三区高清免费看看| 亚洲av无码片一区二区三区 | 黄色av网站在线| 中文字幕日韩欧美在线视频| 在线观看操人| 97av在线影院| 99精品国自产在线| 91嫩草国产在线观看| 欧美在线导航| 亚洲美女搞黄| 亚洲福利一区| 亚洲熟妇av一区二区三区| 日韩高清不卡一区二区三区| 亚洲天堂伊人网| av一区二区不卡| 欧美88888| 婷婷国产v国产偷v亚洲高清| 一区二区乱子伦在线播放| 日韩视频一区二区三区在线播放| 色资源在线观看| x99av成人免费| 韩日毛片在线观看| 91精品久久久久久久久中文字幕| 91夜夜蜜桃臀一区二区三区| 欧美xxxx黑人又粗又长密月 | 欧美啪啪免费视频| 激情另类小说区图片区视频区| 欧美一级片黄色| 国产精品视频看| 国产香蕉视频在线| 欧美日韩激情一区二区三区| 精品国产无码一区二区三区| 亚洲人成网在线播放| 欧美人与动牲性行为| 国产精品久久一区| 久久综合社区| 99中文字幕在线观看| 日韩av中文在线观看| 亚洲av综合色区无码另类小说| 日本一区二区三区国色天香| 日本免费在线播放| 91精品一区二区三区在线观看| 男人天堂综合| 国产69精品久久久| 久久爱www.| 亚洲欧美成人一区| 嫩草成人www欧美| 国产人成视频在线观看| 亚洲啪啪综合av一区二区三区| 欧美性猛交xxxx乱大交hd| 欧美精品一区二区三区蜜桃| 18在线观看的| 国产美女精彩久久| 精品日韩在线| 免费日韩视频在线观看| 成人av在线影院| 免费在线观看av网址| 欧美一级理论片| 午夜免费视频在线国产| 国产精品视频1区| 国产精品一区二区av交换| 毛片在线视频播放| 成人手机在线视频| 久久综合成人网| 日韩亚洲欧美一区| 超碰在线caoporen| 成人福利在线视频| 欧美gay男男猛男无套| 国内自拍视频一区| 国产午夜精品一区二区| 国产三级精品三级在线观看| 日韩精品极品在线观看| 成人影院在线视频| 精品日产一区2区三区黄免费 | 国产h视频在线播放| 成人国产亚洲欧美成人综合网| 欧美日韩人妻精品一区二区三区| 在线播放国产精品二区一二区四区| 91精品大全| 成人网页在线免费观看| 91精品国产乱码久久久久久| 五月天婷婷影视| 亚洲欧美一区二区三区极速播放 | 国产精品视频一区二区三| 欧美三电影在线| 欧美成人二区| 91九色露脸| 影音先锋中文字幕一区| 国产女人18毛片水真多18| 精品国产成人av| 黄色影院在线播放| 国产日韩精品在线观看| 伊人情人综合网| 久草免费资源站| 精品美女久久久久久免费| 深夜福利视频一区| 国产精品福利片| 久久久9色精品国产一区二区三区| 天天影视色综合| 亚洲综合在线五月| 神马午夜精品95| 国产精品99久久久久久久久| 日本不卡高清| 三级网站免费看| 精品福利一区二区| 91caoporn在线| aa成人免费视频| 久久精品三级| 波多野结衣亚洲色图| 日韩电影视频免费| 成人黄页网站视频| 成人午夜视频免费观看| 91亚洲永久精品| 一级黄色片在线播放| 欧美夫妻性生活xx| 国产成人av| 久久久久亚洲av无码麻豆| 欧美丝袜一区二区三区| 日本三级视频在线播放| 国产伦精品一区二区三区视频孕妇| 一本一道久久综合狠狠老精东影业| 日本人亚洲人jjzzjjz| 日韩欧美亚洲另类制服综合在线| 日本午夜大片a在线观看| 中文字幕在线亚洲精品| 91视频免费播放| 国产肥老妇视频|