精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一级片免费| 超碰免费在线| 国产三级国产精品国产国在线观看| 狠狠v欧美ⅴ日韩v亚洲v大胸| 亚洲香蕉视频| 91精品啪在线观看国产手机 | 在线中文字幕不卡| 亚洲第一视频在线观看| 国产精品播放| 91精品国产自产| 日韩在线资源| 一本久久综合| 精品福利在线视频| 国产在线拍揄自揄视频不卡99| 在线播放免费视频| 国产视频二区在线观看| 亚洲三级视频| 日韩欧美中文一区| 丰满女人性猛交| 在线观看免费国产视频| 小说区图片区亚洲| 91蜜桃在线观看| 欧美国产日韩视频| 日日碰狠狠添天天爽超碰97| 国产成人免费看一级大黄| 91精品啪在线观看国产爱臀| 欧美综合天天夜夜久久| 欧美狂野激情性xxxx在线观| 在线免费黄色av| 美女精品久久| 亚洲视频每日更新| 日韩av手机在线看| 动漫美女无遮挡免费| 国产爆初菊在线观看免费视频网站| 国产精品一区2区| 日韩色av导航| 波多野结衣天堂| 亚洲老妇色熟女老太| 97偷自拍亚洲综合二区| 欧美日韩国产成人在线91| av免费观看久久| 国产亚洲精品女人久久久久久| 久久三级中文| 欧美日韩国产综合视频在线观看 | 久久亚洲电影| 亚洲乱亚洲乱妇无码| 蜜臀av色欲a片无码精品一区 | 一呦二呦三呦精品国产| 国产一区二区免费在线| 亚洲欧洲第一视频| 国内自拍在线观看| 91福利在线尤物| 久久久久久久久久久电影| 国产91色在线|免| 一区二区三区视频免费看| 欧美日韩国产色综合一二三四| 欧美大黄免费观看| 精品一二三四五区| 国模私拍视频在线播放| 91在线云播放| 国产精品扒开腿做爽爽爽视频| 国产吃瓜黑料一区二区| 麻豆网站在线看| 日韩国产欧美在线播放| 精品久久久91| aaa黄色大片| 97品白浆高清久久久久久| 精品久久香蕉国产线看观看亚洲 | 免费精品视频| 亚洲精品第一页| 国产91对白刺激露脸在线观看| 涩爱av在线播放一区二区| 91精品国产麻豆国产在线观看| 在线综合+亚洲+欧美中文字幕| 国产毛片久久久久久国产毛片| a毛片在线看免费观看| 91社区在线播放| 久久影视中文粉嫩av| 波多野结衣电影在线播放| 国产成人黄色| 欧美v日韩v国产v| 亚洲不卡视频在线| 成人免费毛片嘿嘿连载视频…| 一区二区在线观看免费| av一区二区三区免费| 亚洲乱熟女一区二区| 免播放器亚洲| 国产欧美久久一区二区| 男的操女的网站| 国产精品xvideos88| 国产一级揄自揄精品视频| 无限资源日本好片| 网站一区二区| 欧美日韩mp4| 亚洲va综合va国产va中文| 69成人在线| av在线免费不卡| 91精品国产综合久久久久久丝袜 | 欧美性色欧美a在线播放| 亚洲精品永久www嫩草| 国产免费亚洲高清| 亚洲精品视频三区| 午夜不卡影院| 亚洲欧美国产三级| 久久精品日韩精品| www.色呦呦| 久久99热99| 日本精品视频在线观看| 精产国品一区二区| 国产视频一区免费看| 精品国内亚洲在观看18黄| 国产午夜精品无码一区二区| 欧美aaaa视频| 国外成人在线直播| 国产在线观看你懂的| 日韩精彩视频在线观看| 国产高清自拍99| 日本三级视频在线观看| 精品福利一区二区| 台湾佬美性中文| 欧美综合久久| 亚洲国产中文字幕久久网 | 中文字幕乱码久久午夜不卡 | 亚洲欧美另类视频| 国产精品你懂的| 亚洲国产精品www| 波多野结衣视频一区二区| 亚洲综合偷拍欧美一区色| 一区二区三区欧美成人| 137大胆人体在线观看| 欧美激情在线看| 日本一区精品| 亚洲成人影院麻豆| 一道本成人在线| 美女喷白浆视频| 欧美美女在线直播| 日韩av在线播放资源| 亚洲天堂av一区二区| 在线一级成人| 91sa在线看| 日韩色图在线观看| 国产一区不卡精品| 中文字幕久精品免| 91一区二区三区在线| 欧美日韩精品欧美日韩精品一 | 妖精一区二区三区精品视频| 97色伦亚洲国产| 日本熟女毛茸茸| 午夜一区在线| 久久大香伊蕉在人线观看热2| 久久久123| 色欧美片视频在线观看在线视频| 男女啪啪网站视频| 午夜精品福利影院| 日韩在线视频一区| 天天鲁一鲁摸一摸爽一爽| 欧美ab在线视频| 91福利视频在线观看| 欧美少妇bbw| 久久九九全国免费| 50路60路老熟妇啪啪| 4438五月综合| 欧美一区二区三区四区在线观看| 国产伦精品一区三区精东| 亚洲综合福利| 国产精品久久91| 在线观看完整版免费| 欧美男男青年gay1069videost| 中文字幕一二三区| 偷拍精品福利视频导航| 欧美自拍视频在线观看| 国产视频手机在线| 不卡的看片网站| 日本成人黄色| 国产69精品久久| 亚洲国产成人精品电影| 九九热精品视频在线| av电影天堂一区二区在线观看| www.国产在线播放| 青青一区二区| 国产精品视频一区二区高潮| 国产精品视频一二区| 国产乱妇无码大片在线观看| 糖心vlog在线免费观看| 欧美日韩国产网站| 操91在线视频| 国产一级在线免费观看| 2020日本不卡一区二区视频| 日韩久久久久久久久久久久| 粉嫩av一区二区三区四区五区 | 黄色录像二级片| 国产老肥熟一区二区三区| 男女视频网站在线观看| 九九热这里有精品| 亚洲国产私拍精品国模在线观看| 在线天堂中文字幕| 国产日韩欧美精品电影三级在线| 男人添女荫道口女人有什么感觉| 网友自拍一区| 95av在线视频| 免费成人av电影| 亚洲v精品v日韩v欧美v专区| www.久久com| 日韩mv欧美mv国产网站| 国产剧情日韩欧美| 不卡的av影片| 在线视频精品一| 大地资源二中文在线影视观看| 美国一区二区三区在线播放| 九九九九九九精品| 中文字幕成人| 91精品国产成人| 成人短视频在线| 亚洲人成电影网站色www| 国产69精品久久久久久久久久| 久久精品久久精品| 日韩欧美一区三区| 欧美色女视频| 久久精品二区| 99re热精品视频| 91在线观看免费高清| 成人短视频在线观看| 精品视频在线观看日韩| 成人免费区一区二区三区| 中文字幕一区三区| wwwxxxx在线观看| 秋霞影院一区二区| 国产精品jizz在线观看老狼| 久久久精品国产**网站| 97av在线视频免费播放| 在线观看中文字幕的网站| 中文字幕欧美日韩精品| 免费在线观看一级毛片| 亚洲成人久久久| 国产毛片毛片毛片毛片| 欧美日韩一区二区三区在线看| 国产精品久久免费观看| 三级欧美韩日大片在线看| 日韩欧美猛交xxxxx无码| 神马影视一区二区| 国产噜噜噜噜噜久久久久久久久| 韩国主播福利视频一区二区三区| 亚洲视频自拍偷拍| 日批视频免费播放| 五月开心婷婷久久| 青青青在线视频| 久久综合九色综合97_久久久| 国产黄色一区二区三区 | 91福利免费观看| 日韩高清在线一区| 国产偷人视频免费| jizzjizz欧美69巨大| 国产欧美日韩综合精品| 国产人妖一区| 国产精品亚发布| 亚洲人成777| 91色在线视频| 亚洲一区二区三区中文字幕在线观看| 亚洲v日韩v综合v精品v| 日韩高清在线观看一区二区| 国产精品美女在线| 午夜无码国产理论在线| 清纯唯美亚洲激情| 中文字幕不卡三区视频| 国产精品678| 9lporm自拍视频区在线| 欧美大片欧美激情性色a∨久久| 影音先锋男人资源在线| 粗暴蹂躏中文一区二区三区| 尤物视频在线看| 国内外成人免费激情在线视频| 两个人看的在线视频www| 在线精品视频视频中文字幕| h视频网站在线观看| 尤物精品国产第一福利三区 | 久久久久久久久久久免费 | 国产一级片免费看| 亚洲一区二区三区美女| 又黄又爽的网站| 99国产精品久久| 成都免费高清电影| 国产一区二区三区久久久| 国产成人精品一区二区三区在线观看| 国产成人啪午夜精品网站男同| 久久久久99精品成人片| 国产精品美女久久久浪潮软件| www.色偷偷.com| 美女视频第一区二区三区免费观看网站 | 免费看污视频的网站| 在线播放中文字幕一区| 国产99对白在线播放| 亚洲成人久久电影| 91视频在线观看| 久久久亚洲精选| julia一区二区三区中文字幕| 国产美女精品视频| 欧美区一区二区| 日韩av在线一区二区三区| 99精品女人在线观看免费视频| 91久久久久久久久久久久久| 中文字幕久久精品一区二区| 美媛馆国产精品一区二区| 99免费精品| 尤物一区二区三区| 自拍视频亚洲| 四虎精品欧美一区二区免费| 欧美oldwomenvideos| 久久亚洲国产成人精品无码区 | 鲁一鲁一鲁一鲁一av| 亚洲欧美日韩国产一区| 日韩欧美在线免费观看视频| 欧美色一级片| www欧美激情| 成人免费高清视频| 波多野结衣在线免费观看| 91视频你懂的| 国产一级av毛片| 3d动漫精品啪啪| www.黄在线观看| 5252色成人免费视频| av在线导航| 国产精品久久激情| 欧美一级色片| 僵尸世界大战2 在线播放| 一本一本久久| 伊人成人免费视频| 国产精品久久777777| 69视频免费看| 亚洲成人中文字幕| 性欧美1819sex性高清大胸| 九色91av视频| 七七成人影院| 国产精品入口尤物| 国产一区二区在线| 国产aaa一级片| 91在线观看地址| 国产成人自拍视频在线| 亚洲大胆美女视频| www.8ⅹ8ⅹ羞羞漫画在线看| 91精品视频观看| 91精品啪在线观看国产18| 色戒在线免费观看| 国产精品欧美极品| 69av视频在线观看| 亚洲欧美成人网| 芒果视频成人app| 日韩av高清| 青青国产91久久久久久| 久久亚洲AV无码专区成人国产| 波波电影院一区二区三区| 国产又黄又爽又无遮挡| 一卡二卡三卡日韩欧美| 精品人妻一区二区三区浪潮在线| 深夜福利亚洲导航| 日本精品裸体写真集在线观看| 欧美日韩一区二区视频在线| 日韩伦理一区| 国产无限制自拍| 大陆成人av片| 免费在线黄色片| 欧美日本韩国一区| 在线观看h片| 91久久精品久久国产性色也91| 日韩免费看片| 伊人色在线视频| 亚洲一区二区三区爽爽爽爽爽| 人妻va精品va欧美va| 91豆花精品一区| 国产毛片一区二区三区| 99福利在线观看| 国产亚洲欧美色| 91丨九色丨海角社区| 中文国产亚洲喷潮| 久久国际精品| 久久久久久久久久久视频| 国产目拍亚洲精品99久久精品| 天堂av免费在线观看| 色爱av美腿丝袜综合粉嫩av| 91丨精品丨国产| 亚洲精品久久久久久久蜜桃臀| 91久色porny| 亚洲综合免费视频| 日韩精品在线播放| 国产成人a视频高清在线观看| 中文字幕综合在线观看| 岛国精品在线播放| 亚洲色成人www永久网站| 欧美老女人xx| 香蕉久久精品| 中文字幕日韩综合| 欧美色另类天堂2015| 性猛交富婆╳xxx乱大交天津 | 亚洲欧美丝袜| 成人中文字幕合集| 国产美女www| 欧美国产极速在线| 日本道不卡免费一区| 大乳护士喂奶hd| 91 com成人网| 白浆在线视频|