[iOS/OC]platform_memmove的Crash

0x0 背景

原本是放到自己博客的葛超,不怎么用了,把文章同步過來浅辙,原文地址[iOS/OC]platform_memmove的Crash

這個問題是今年1月底排查的删顶,gif/apng動圖播放時在iOS11以下會小概率閃退。是個比較有趣的Crash闭专,重新記錄一下奴潘。

典型堆棧:

#13. Crashed: PINAnimatedImage disk write queue
0  libsystem_platform.dylib       0x1915d4e60 _platform_memmove + 96
1  ImageIO                        0x1943c0a74 GIFReadPlugin::copyImageBlockSet(InfoRec*, CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 3192
2  ImageIO                        0x1943c0a74 GIFReadPlugin::copyImageBlockSet(InfoRec*, CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 3192
3  ImageIO                        0x1943bf7c4 GIFReadPlugin::CopyImageBlockSetProc(void*, CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 124
4  ImageIO                        0x19422073c IIOImageProviderInfo::copyImageBlockSetWithOptions(CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 496
5  ImageIO                        0x19421e640 IIOImageProviderInfo::CopyImageBlockSetWithOptions(void*, CGImageProvider*, CGRect, CGSize, __CFDictionary const*) + 356
6  CoreGraphics                   0x1939eeb24 CGImageProviderCopyImageBlockSet + 220
7  CoreGraphics                   0x193c833ac imageProvider_getBytes + 88
8  CoreGraphics                   0x193ab30e0 CGDataProviderCopyData + 280
9  Pinterest                      0x100a46238 __94+[PINAnimatedImageManager processAnimatedImage:temporaryDirectory:infoCompletion:decodedPath:]_block_invoke.225 (PINAnimatedImageManager.m:397)
10 libdispatch.dylib              0x1913d21fc _dispatch_call_block_and_release + 24
11 libdispatch.dylib              0x1913d21bc _dispatch_client_callout + 16
12 libdispatch.dylib              0x1913e012c _dispatch_queue_serial_drain + 240
13 libdispatch.dylib              0x1913d59a4 _dispatch_queue_invoke + 652
14 libdispatch.dylib              0x1913e08d8 _dispatch_queue_override_invoke + 360
15 libdispatch.dylib              0x1913e234c _dispatch_root_queue_drain + 572
16 libdispatch.dylib              0x1913e20ac _dispatch_worker_thread3 + 124
17 libsystem_pthread.dylib        0x1915db2a0 _pthread_wqthread + 1288
18 libsystem_pthread.dylib        0x1915dad8c start_wqthread + 4

openradar的問題鏈接

SDWebImage的問題鏈接

該問題在Google上能搜到的結(jié)果還是不少的,但是有效信息很少影钉。比較有用的是openradar上提到的iOS10.3beta上已經(jīng)修復(fù)了該問題画髓。可以略微松一口氣平委,最不濟可以甩鍋給蘋果了奈虾。甚至如果你的APP只支持iOS11(可能性不大,但是萬一有呢)廉赔,都可以直接忽略了肉微。

0x1 Crash原因

雖然是系統(tǒng)的BUG,但是還是要搞清楚Crash的原因蜡塌,盡量在業(yè)務(wù)代碼上避免該問題引發(fā)其他的風(fēng)險碉纳。排查過程比較艱辛,只說最終結(jié)果吧:

CGContextDrawImage();不再保證對imageRef的原子操作馏艾。
當(dāng)對于1個imageRef劳曹,有多個線程并發(fā)繪制時,會觸發(fā)buffer的memcmp的Crash

根據(jù)問題原因可以知道琅摩,其實該Crash在多線程同時解碼同1份imageRef時才會Crash铁孵,因此如果沒有引入SDWebImage/YYImage等三方圖片庫,系統(tǒng)默認主線程解碼是不會有改Crash的房资。

另外蜕劝,靜圖解碼也是有概率Crash,但是網(wǎng)上反饋比較少志膀,主要原因也是概率的問題熙宇。和一般的多線程Crash一樣鳖擒,次數(shù)多了概率才打溉浙,在相同的業(yè)務(wù)場景下烫止,動圖解碼的頻次遠高于靜圖,因此動圖更容易觸發(fā)該Crash戳稽。

0x2 Crash防護

知道Crash原因后馆蠕,防護相對就比較簡單了,只要保證不會對同一個image資源同時解碼就可以了惊奇。1個簡單的方法是在解碼時互躬,使用UIImage作為input,對UIImage進行多線程保護颂郎。如:

@synchronized(image) {
    return [self decodedImageWithCGImageRef:image.CGImage];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吼渡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乓序,更是在濱河造成了極大的恐慌寺酪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件替劈,死亡現(xiàn)場離奇詭異寄雀,居然都是意外死亡,警方通過查閱死者的電腦和手機陨献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門盒犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眨业,你說我怎么就攤上這事急膀。” “怎么了龄捡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵脖阵,是天一觀的道長。 經(jīng)常有香客問我墅茉,道長命黔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任就斤,我火速辦了婚禮悍募,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洋机。我一直安慰自己坠宴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布绷旗。 她就那樣靜靜地躺著喜鼓,像睡著了一般副砍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庄岖,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天豁翎,我揣著相機與錄音,去河邊找鬼隅忿。 笑死心剥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的背桐。 我是一名探鬼主播优烧,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼链峭!你這毒婦竟也來了畦娄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤弊仪,失蹤者是張志新(化名)和其女友劉穎熙卡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撼短,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡再膳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曲横。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂柒。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖禾嫉,靈堂內(nèi)的尸體忽然破棺而出灾杰,到底是詐尸還是另有隱情,我是刑警寧澤熙参,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布艳吠,位于F島的核電站,受9級特大地震影響孽椰,放射性物質(zhì)發(fā)生泄漏昭娩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一黍匾、第九天 我趴在偏房一處隱蔽的房頂上張望栏渺。 院中可真熱鬧,春花似錦锐涯、人聲如沸磕诊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霎终。三九已至滞磺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莱褒,已是汗流浹背击困。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留保礼,地道東北人沛励。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓责语,卻偏偏與公主長得像炮障,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坤候,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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