CFNetwork HTTPProtocol::shouldAttemptOriginLoad() crash on iOS12.x

最近工作中在crash日志收集到這樣的信息:SEGV_ACCERR?CFNetwork?__ZN12HTTPProtocol23shouldAttemptOriginLoadEv

HTTPProtocol::shouldAttemptOriginLoad(),

HTTPProtocol::_protocolInterface_startLoad

如圖1:

圖 1

經過多番的資料查詢,了解到這是iOS12.x系統會出現的一個問題。CFNetwork crash on iOS 12.x。蘋果網站上面出現過相關crash的討論,但沒有找到一個說出解決方案的,我們經過長時間推敲,有以下復現方式和解決方案。

您可以通過NSURLProtocol對請求進行攔截,在startLoading和stopLoading方法的堆棧跟蹤來確定___ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2調用startLoading,而CFURLProtocol_NS :: _ protocolInterface_cancelLoad()由于cancel請求會調用stopLoading.

crash的復現方式總結如下:

在項目中對某一個請求循環發送500+次,每次send之前cancel掉上一次的請求,即可復現這種crash,且是必現。如圖2:

圖 2

我司項目中是某一個列表因特殊原因每次需要用SDWebImage進行請求(此處請求不是取磁盤或內存中的圖片)頻率過高導致(SD一般不會產生這樣的問題,因為多數取的緩存,而且SD默認有開啟線程的個數限制的,若想復現bug,可通過options每次走遠程請求)。如果您遇見了,可以查看是不是在滑動列表的時候在不斷send和cancel網絡請求

希望以上能幫到同行們,上述若有不足或錯誤,盼請指正!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容