iOS App 後台任務的坑

2021-08-28 00:16:49 字數 3062 閱讀 4786

crash 訊號

解決第乙個問題,只要將工具的執行時間盡可能提前,或者確保之前的**及可能簡單可靠。

解決第二個問題,可以採用我之前分享過的,使用 nsurlsession 的 background mode。

background task 花式 crash

0xdead10cc

這個 crash 日誌一般長這樣: ios,馬甲包,低要求,內容開發沒有限制,報酬豐厚,實力誠信 q:782675105

exception type:  exc_crash (sigkill)

exception codes: 0x0000000000000000, 0x0000000000000000

exception note:  exc_corpse_notify

termination reason: namespace springboard, code 0xdead10cc

termination description: springboard, com.***.*** was task-suspended with locked system file

0xbada5e47

當你聽從了上面的建議,大大方方的把盡可能多的關鍵**封入 background task 後,那麼你可能會遇到下面的 crash:

exception type:  exc_crash (sigkill)

exception codes: 0x0000000000000000, 0x0000000000000000

exception note:  exc_corpse_notify

termination reason: namespace assertiond, code 0xbada5e47

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

0x8badf00d

background task 其實也可以 0x8badf00d 的,比如:

exception type:  exc_crash (sigkill)

exception codes: 0x0000000000000000, 0x0000000000000000

exception note:  exc_corpse_notify

termination reason: namespace springboard, code 0x8badf00d

當你的**邏輯會產生 leaked background task 時,就會出現上面的系統強殺 crash 日誌了,什麼是 leaked background task 呢?看**:

- (void)startbgtask];}

- (void)endbgtask

上面的**如果 startbgtask 執行兩次,就一定會出現 leaked background task,因為 self.bgtaskid 第二次會被賦予乙個新的 id,之前的 task id 就丟失了,無法正確呼叫 end。

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

thread 0 crashed:0   

libsystem_kernel.dylib        0x000000018472be08 0x18472b000 + 35921   

libsystem_kernel.dylib        0x000000018472bc80 0x18472b000 + 32002   

corefoundation                0x0000000184c6ee40 0x184b81000 + 9744003   

corefoundation                0x0000000184c6c908 0x184b81000 + 9648724   

corefoundation                0x0000000184b8cda8 0x184b81000 + 485525   

graphicsservices              0x0000000186b6f020 0x186b64000 + 450886   

uikit                         0x000000018eb6d78c 0x18e850000 + 32664447   

messenger                     0x0000000103015ee4 0x102ff8000 + 1225968   

libdyld.dylib                 0x000000018461dfc0 0x18461d000 + 4032

這個 stack 很經典,經常會看到,不需要 symbolicate 也能知道是幹啥,這是 ui 執行緒 runloop 處於 idle 狀態的 stack,在等待 kernel 的 message。表示 ui 執行緒此時處於閒置狀態,這種狀態下的系統強殺大概率是由於 leaked background task 導致的。

善用裝置本地的 crash 日誌

當使用者的手機遇到 crash,而你既無法重現又在後台找不到 crash 日誌的時候,此時你最大的希望就是手機本地的 crash 日誌了。

如果調查記憶體使用過多的 crash,可以檢視 jetsamevent-*** 開頭的日誌。

總結

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

iOS後台任務

ios後台執行分方式有三種 後台永遠執行分為這幾種情況 獲取定位更新 getting location updates voip 呼叫 handing voip calls 實現方式 後台短暫執行 實現方式 接收進入後台通知 nsnotificationcenter defaultcenter ad...

powershell後台任務

比如在後台執行ping 8.8.8.8 start job scriptblock 從返回可以看到job的基本資訊 id name psjobtypename state hasmoredata location command 3 job3 backgroundjob running true l...

Linux 後台任務

1 我想把updatedb命令 用於重新建立整盤索引的命令 放在後台執行。updatedb 1 23336注釋 在所要執行的命令後面加上空格,再加上 符號即可實現後台執行。所返回的 1 表示這是第乙個你放到後台的任務。23336是這個任務的程序號。2 我執行updatedb時忘了加 了,這下我怎麼辦...