iOS疑難崩潰問題梳理

負(fù)責(zé)iOS版本質(zhì)量這段時(shí)間碰到了不少疑難崩潰汛蝙,它們的統(tǒng)一特點(diǎn)就是崩潰棧信息十分十分不明確豺撑,導(dǎo)致解決起來異常困難质帅。這里梳理和記錄一下那些曾經(jīng)令人頭禿的崩潰适揉。(不定期更新)

1、多線程操作NSMutable類型數(shù)據(jù)

1煤惩、NSMutableData appendBytes崩潰

5 Foundation    __NSMutableDataGrowBytes + 272
6 Foundation    -[NSConcreteMutableData appendBytes:length:] + 372
7 Foundation    ___49-[_NSDispatchData enumerateByteRangesUsingBlock:]_block_invoke + 44
8 libdispatch.dylib __dispatch_data_apply + 128
9 libdispatch.dylib dispatch_data_apply + 40
10 Foundation   -[_NSDispatchData enumerateByteRangesUsingBlock:] + 64
11 Foundation   -[NSConcreteMutableData appendData:]

2嫉嘀、使用BlocksKit子線程遍歷__NSDictionaryM(NSMutableDictionary)崩潰

0 libobjc.A.dylib   objc_retain + 8
1 MojiWeather   __35-[NSDictionary(BlocksKit) bk_each:]_block_invoke (NSDictionary+BlocksKit.m:14)
2 CoreFoundation    -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 232
3 MojiWeather   -[NSDictionary(BlocksKit) bk_each:] (NSDictionary+BlocksKit.m:17)
4 MojiWeather   -[AdvSystemNetworkManager p_handleNoAdResponse:] (AdvSystemNetworkManager.m:394)
5 MojiWeather   __33-[GCDAsyncSocket closeWithError:]_block_invoke (GCDAsyncSocket.m:3143)
6 libdispatch.dylib __dispatch_call_block_and_release + 24
7 libdispatch.dylib __dispatch_client_callout + 16
8 libdispatch.dylib __dispatch_queue_serial_drain$VARIANT$mp + 528
9 libdispatch.dylib __dispatch_queue_invoke$VARIANT$mp + 340
10 libdispatch.dylib    __dispatch_root_queue_drain_deferred_wlh$VARIANT$mp + 404
11 libdispatch.dylib    __dispatch_workloop_worker_thread$VARIANT$mp + 644
12 libsystem_pthread.dylib  _pthread_wqthread + 932

此類崩潰的共同點(diǎn)都很明顯
1、崩潰棧中出現(xiàn)了NSMutable為前綴的類對(duì)象魄揉。
2剪侮、崩潰棧均在子線程中調(diào)用。

觸發(fā)場(chǎng)景:

多個(gè)線程同時(shí)操作NSMutableData洛退、NSMutableArray時(shí)即容易出現(xiàn)崩潰瓣俯。

解決方案:

1、在串行隊(duì)列中進(jìn)行操作兵怯。

//在串行隊(duì)列中異步執(zhí)行
dispatch_async(serialQueue, ^{
    //critical section彩匕,進(jìn)行數(shù)據(jù)的增刪改操作。
});

2媒区、加鎖驼仪。

//使用信號(hào)量加鎖
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
//critical section,進(jìn)行數(shù)據(jù)的增刪改操作袜漩。
dispatch_semaphore_signal(self.semaphore);

備注:

蘋果官方梳理的線程不安全的類

2绪爸、CTTelephonyNetworkInfo崩潰

0 libobjc.A.dylib   objc_msgSend + 16
1 CoreTelephony _ServerConnectionCallback(__CTServerConnection*, __CFString const*, __CFDictionary const*, void*) + 52
2 CoreTelephony invocation function for block in CTServerState::sendNotification_sync(CTEvent, __CFString const*, __CFDictionary const*) const + 32
3 libdispatch.dylib __dispatch_call_block_and_release + 24
4 libdispatch.dylib __dispatch_client_callout + 16
5 libdispatch.dylib __dispatch_queue_drain + 1216
6 libdispatch.dylib __dispatch_queue_invoke + 132
7 libdispatch.dylib __dispatch_root_queue_drain + 664
8 libdispatch.dylib __dispatch_worker_thread3 + 108
9 libsystem_pthread.dylib   _pthread_wqthread + 816

這個(gè)崩潰僅在iOS9及以下系統(tǒng)版本上出現(xiàn)。乍一看很令人費(fèi)解宙攻,但是仔細(xì)看能注意到崩潰棧中出現(xiàn)了CoreTelephony這個(gè)庫奠货,在iOS9以下版本上的CTTelephonyNetworkInfo對(duì)象有bug,已經(jīng)釋放的CTTelephonyNetworkInfo對(duì)象會(huì)接受通知并崩潰座掘。繼續(xù)排查項(xiàng)目递惋,發(fā)現(xiàn)舊版本Reachability里的CTTelephonyNetworkInfo不是類變量,會(huì)被多次初始化和釋放雹顺,存在崩潰風(fēng)險(xiǎn)丹墨。

觸發(fā)場(chǎng)景

多處調(diào)用舊版本的
[[Reachability reachabilityForLocalWiFi] isReachableViaWiFi]等方法。

解決方案

修改CTTelephonyNetworkInfo為類變量嬉愧,或者使用AFN里的AFNetworkReachabilityManager作為替代贩挣。

備注

CTTelephonyNetworkInfo should not be released

3、內(nèi)存泄露崩潰

0 libobjc.A.dylib   objc_object::release() + 16
1 libobjc.A.dylib   (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
2 libobjc.A.dylib   (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 844
3 libdispatch.dylib __dispatch_last_resort_autorelease_pool_pop + 36
4 libdispatch.dylib __dispatch_root_queue_drain + 1308
5 libdispatch.dylib __dispatch_worker_thread3 + 120
6 libsystem_pthread.dylib   _pthread_wqthread + 1176

通過調(diào)用棧AutoreleasePoolPage::pop,可以得知此時(shí)系統(tǒng)正在調(diào)用自動(dòng)釋放池的釋放操作(通過objc_object::release()也可以看出是對(duì)象內(nèi)存釋放時(shí)出現(xiàn)的崩潰)王财,因此判定是內(nèi)存泄露問題卵迂。

觸發(fā)場(chǎng)景

通過instrument分析,發(fā)現(xiàn)以下代碼有嚴(yán)重的內(nèi)存泄露問題:

MTLModel.m line 45: [obj validateValue:&validatedValue forKey:key error:error]

解決方案

參照鏈接绒净,給MTLModel增加分類方法见咒。

https://github.com/Mantle/Mantle/issues/818

https://github.com/Mantle/Mantle/issues/787#issuecomment-286608719

備注

內(nèi)存泄露這類問題不同的項(xiàng)目有不同的原因,建議多使用instrument的leaks排查挂疆,并通過崩潰趨勢(shì)來大致確認(rèn)出現(xiàn)問題的業(yè)務(wù)模塊改览。

4、后臺(tái)操作UIWindow問題

0 libobjc.A.dylib   objc_retain + 16
1 UIKit ___39-[UIWindow _noteOverlayInsetsDidChange]_block_invoke + 132
2 UIKit __runAfterCACommitDeferredBlocks + 292
3 UIKit __cleanUpAfterCAFlushAndRunDeferredBlocks + 560
4 UIKit __afterCACommitHandler + 168
5 CoreFoundation    ___CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
6 CoreFoundation    ___CFRunLoopDoObservers + 372
7 CoreFoundation    ___CFRunLoopRun + 1024
8 CoreFoundation    CFRunLoopRunSpecific + 444
9 GraphicsServices  GSEventRunModal + 180
10 UIKit    -[UIApplication _run] + 684
11 UIKit    UIApplicationMain + 208
12 MojiWeather  main (main.m:16)
13 libdyld.dylib    _start + 4

僅在iOS10以下設(shè)備出現(xiàn)缤言。崩潰棧完全得不到有用信息宝当,但是在Bugly上傳的頁面跟蹤數(shù)據(jù)中可以看出每次崩潰的頁面停留都是剛啟動(dòng)應(yīng)用時(shí)在二級(jí)Splash展示時(shí)崩潰,我們項(xiàng)目中的二級(jí)Splash是通過設(shè)置RootViewController的方式展示的胆萧,因此基本判斷是操作Splash的Window時(shí)出現(xiàn)的崩潰庆揩。繼續(xù)排查log,發(fā)現(xiàn)幾乎所有崩潰用戶在application:didFinishLaunchingWithOptions:方法中的launchOption的key值都是UIApplicationLaunchOptionsLocationKey跌穗,因此判斷該崩潰出現(xiàn)在用戶后臺(tái)定位發(fā)生改變時(shí)订晌,并不是用戶在前臺(tái)操作產(chǎn)生。

觸發(fā)場(chǎng)景

后臺(tái)定位功能觸發(fā)時(shí)蚌吸,應(yīng)用操作UIWindow導(dǎo)致锈拨。

解決方案

在application:didFinishLaunchingWithOptions:中判斷l(xiāng)aunchOption,如果是UIApplicationLaunchOptionsLocationKey方式進(jìn)入應(yīng)用羹唠,則不觸發(fā)二級(jí)Splash展示推励。即不操作UIWindow。

5肉迫、后臺(tái)OpenGL繪制問題

由于項(xiàng)目接入了cocos2d-objc,因此陸陸續(xù)續(xù)出現(xiàn)過各類后臺(tái)繪制問題稿黄。
這里統(tǒng)一梳理一下:只要崩潰棧中出現(xiàn)GLEngine喊衫、OpenGLES、gpusSubmitDataBuffers等相關(guān)字眼杆怕,即確認(rèn)為繪制問題族购。

觸發(fā)場(chǎng)景

這里的場(chǎng)景有兩種:1、同問題4陵珍,launchOption為UIApplicationLaunchOptionsLocationKey時(shí)其實(shí)應(yīng)用還在后臺(tái)寝杖,此時(shí)觸發(fā)OpenGL繪制即崩潰。

2互纯、用戶手動(dòng)進(jìn)入后臺(tái)之后(即調(diào)用UIApplication DidEnterBackground)瑟幕,繪制沒有停止。

解決方案

1、觸發(fā)后臺(tái)定位進(jìn)入引用時(shí)只盹,程序會(huì)走willFinishLaunchingWithOptions和didFinishLaunchingWithOptions辣往,但是不會(huì)走didBecomeActive,因此可以在didBecomeActive方法中增加標(biāo)志位殖卑,沒有走過didBecomeActive時(shí)站削,不觸發(fā)cocos2D的繪制。

2孵稽、在didEnterBackground增加停止繪制的操作许起。

備注

OpenGL ES May Not Be Used in Background Apps

6、Testflight包崩潰問題菩鲜。

測(cè)試使用Testflight包覆蓋Debug包园细,頻現(xiàn)崩潰,但是開發(fā)使用xcode Debug無法復(fù)現(xiàn)崩潰睦袖。導(dǎo)出設(shè)備崩潰日志發(fā)現(xiàn)崩潰棧信息為:

Application Specific Information:
abort() called

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x000000021b8619fc __ulock_wait + 8
1   libdispatch.dylib               0x000000010c42d878 0x10c428000 + 22648
2   libdispatch.dylib               0x000000010c42d9b0 0x10c428000 + 22960
3   libdispatch.dylib               0x000000010c43bbb8 0x10c428000 + 80824
4   libdispatch.dylib               0x000000010c43b5d0 0x10c428000 + 79312
5   GPUToolsCore                    0x000000010c4bc488 0x10c4ac000 + 66696
6   GPUToolsCore                    0x000000010c4bf204 0x10c4ac000 + 78340
7   dyld                            0x0000000109235504 ImageLoaderMachO::doModInitFunctions+ 103684 (ImageLoader::LinkContext const&) + 404
8   dyld                            0x0000000109235738 ImageLoaderMachO::doInitialization+ 104248 (ImageLoader::LinkContext const&) + 36
9   dyld                            0x0000000109230768 ImageLoader::recursiveInitialization+ 83816 (ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 464
10  dyld                            0x000000010922f798 ImageLoader::processInitializers+ 79768 (ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 136
11  dyld                            0x000000010922f854 ImageLoader::runInitializers+ 79956 (ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 84
12  dyld                            0x000000010921e680 dyld::initializeMainExecutable+ 9856 () + 184
13  dyld                            0x0000000109223468 dyld::_main+ 29800 (macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 4600
14  dyld                            0x000000010921d044 _dyld_start + 68

解決方案

刪掉包珊肃,重新安裝TestFlight包進(jìn)行測(cè)試。

備注

https://forums.xamarin.com/discussion/103272/crash-ios-11-version-on-ios-10-exc-crash-abort-called-in-ad-hoc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馅笙,一起剝皮案震驚了整個(gè)濱河市伦乔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌董习,老刑警劉巖烈和,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異皿淋,居然都是意外死亡招刹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門窝趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疯暑,“玉大人,你說我怎么就攤上這事哑舒「菊” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵洗鸵,是天一觀的道長(zhǎng)越锈。 經(jīng)常有香客問我,道長(zhǎng)膘滨,這世上最難降的妖魔是什么甘凭? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮火邓,結(jié)果婚禮上丹弱,老公的妹妹穿的比我還像新娘德撬。我一直安慰自己,他們只是感情好蹈矮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布砰逻。 她就那樣靜靜地躺著,像睡著了一般泛鸟。 火紅的嫁衣襯著肌膚如雪蝠咆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天北滥,我揣著相機(jī)與錄音刚操,去河邊找鬼。 笑死再芋,一個(gè)胖子當(dāng)著我的面吹牛菊霜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播济赎,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鉴逞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了司训?” 一聲冷哼從身側(cè)響起构捡,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳猜,沒想到半個(gè)月后勾徽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统扳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年喘帚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒钟。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吹由,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱嘴,到底是詐尸還是另有隱情溉知,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布腕够,位于F島的核電站,受9級(jí)特大地震影響舌劳,放射性物質(zhì)發(fā)生泄漏帚湘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一甚淡、第九天 我趴在偏房一處隱蔽的房頂上張望大诸。 院中可真熱鬧捅厂,春花似錦、人聲如沸资柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贿堰。三九已至辙芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羹与,已是汗流浹背故硅。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵搁,地道東北人吃衅。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腾誉,于是被迫代替她去往敵國和親徘层。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,373評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,097評(píng)論 1 32
  • 1利职、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評(píng)論 3 119
  • 06年趣效,讀高二,首次接觸war3眼耀,那個(gè)時(shí)候英支,天王sky如日中天,無人能擋哮伟,那時(shí)的四大鬼王各領(lǐng)風(fēng)騷干花,比起moon也毫...
    90后不哭閱讀 326評(píng)論 0 3
  • 我今年明明才只有18歲而已,可是就已經(jīng)變得謹(jǐn)小慎微 家庭從來沒讓我安心過楞黄,我的父母好像總是在因?yàn)樾∈聽?zhēng)吵池凄,經(jīng)常,我...
    凡各黎閱讀 238評(píng)論 0 1