App崩潰追蹤,原因定位分析

當(dāng)iOS設(shè)備上的App應(yīng)用閃退時(shí)朵逝,操作系統(tǒng)會(huì)生成一個(gè)crash日志蔚袍,保存在設(shè)備上。crash日志上有很多有用的信息,比如每個(gè)正在執(zhí)行線程的完整堆棧跟蹤信息和內(nèi)存映像啤咽,這樣就能夠通過解析這些信息進(jìn)而定位crash發(fā)生時(shí)的代碼邏輯晋辆,從而找到App閃退的原因。通常來說宇整,crash產(chǎn)生來源于兩種問題:違反iOS系統(tǒng)規(guī)則導(dǎo)致的crash和App代碼邏輯BUG導(dǎo)致的crash瓶佳,下面分別對(duì)他們進(jìn)行分析。

違反iOS系統(tǒng)規(guī)則產(chǎn)生crash的三種類型

(1) 內(nèi)存報(bào)警閃退

當(dāng)iOS檢測到內(nèi)存過低時(shí)鳞青,它的VM系統(tǒng)會(huì)發(fā)出低內(nèi)存警告通知霸饲,嘗試回收一些內(nèi)存;如果情況沒有得到足夠的改善臂拓,iOS會(huì)終止后臺(tái)應(yīng)用以回收更多內(nèi)存厚脉;最后,如果內(nèi)存還是不足胶惰,那么正在運(yùn)行的應(yīng)用可能會(huì)被終止掉傻工。在Debug模式下,可以主動(dòng)將客戶端執(zhí)行的動(dòng)作邏輯寫入一個(gè)log文件中孵滞,這樣程序童鞋可以將內(nèi)存預(yù)警的邏輯寫入該log文件中捆,當(dāng)發(fā)生如下截圖中的內(nèi)存報(bào)警時(shí),就是提醒當(dāng)前客戶端性能內(nèi)存吃緊剃斧,可以通過Instruments工具中的Allocations

和 Leaks模塊庫來發(fā)現(xiàn)內(nèi)存分配問題和內(nèi)存泄漏問題轨香。

(2) 響應(yīng)超時(shí)

當(dāng)應(yīng)用程序?qū)σ恍┨囟ǖ氖录ū热鐔?dòng)、掛起幼东、恢復(fù)臂容、結(jié)束)響應(yīng)不及時(shí),蘋果的Watchdog機(jī)制會(huì)把應(yīng)用程序干掉根蟹,并生成一份相應(yīng)的crash日志脓杉。這些事件與下列UIApplicationDelegate方法相對(duì)應(yīng),當(dāng)遇到Watchdog日志時(shí)简逮,可以檢查上圖中的幾個(gè)方法是否有比較重的阻塞UI的動(dòng)作球散。

application:didFinishLaunchingWithOptions:

applicationWillResignActive:

applicationDidEnterBackground:

applicationWillEnterForeground:

applicationDidBecomeActive:

applicationWillTerminate:

(3) 用戶強(qiáng)制退出

一看到“用戶強(qiáng)制退出”,首先可能想到的雙擊Home鍵散庶,然后關(guān)閉應(yīng)用程序蕉堰。不過這種場景一般是不會(huì)產(chǎn)生crash日志的,因?yàn)殡p擊Home鍵后悲龟,所有的應(yīng)用程序都處于后臺(tái)狀態(tài)屋讶,而iOS隨時(shí)都有可能關(guān)閉后臺(tái)進(jìn)程,當(dāng)應(yīng)用阻塞界面并停止響應(yīng)時(shí)這種場景才會(huì)產(chǎn)生crash日志须教。這里指的“用戶強(qiáng)制退出”場景皿渗,是稍微比較復(fù)雜點(diǎn)的操作:先按住電源鍵斩芭,直到出現(xiàn)“滑動(dòng)關(guān)機(jī)”的界面時(shí),再按住Home鍵乐疆,這時(shí)候當(dāng)前應(yīng)用程序會(huì)被終止掉划乖,并且產(chǎn)生一份相應(yīng)事件的crash日志。

應(yīng)用邏輯的Bug

大多數(shù)閃退崩潰日志的產(chǎn)生都是因?yàn)閼?yīng)用中的Bug挤土,這種Bug的錯(cuò)誤種類有很多琴庵,比如

SEGV:(Segmentation Violation,段違例)仰美,無效內(nèi)存地址细卧,比如空指針,未初始化指針筒占,棧溢出等;

SIGABRT:收到Abort信號(hào)蜘犁,可能自身調(diào)用abort()或者收到外部發(fā)送過來的信號(hào)翰苫;

SIGBUS:總線錯(cuò)誤。與SIGSEGV不同的是这橙,SIGSEGV訪問的是無效地址(比如虛存映射不到物理內(nèi)存)奏窑,而SIGBUS訪問的是有效地址,但總線訪問異常(比如地址對(duì)齊問題)屈扎;

SIGILL:嘗試執(zhí)行非法的指令埃唯,可能不被識(shí)別或者沒有權(quán)限;

SIGFPE:Floating Point Error鹰晨,數(shù)學(xué)計(jì)算相關(guān)問題(可能不限于浮點(diǎn)計(jì)算)墨叛,比如除零操作;

SIGPIPE:管道另一端沒有進(jìn)程接手?jǐn)?shù)據(jù)模蜡;

常見的崩潰原因基本都是代碼邏輯問題或資源問題漠趁,比如數(shù)組越界,訪問野指針或者資源不存在忍疾,或資源大小寫錯(cuò)誤等闯传。

crash的收集

在Mac 系統(tǒng)上,只需要打開xcode->windows->devices卤妒,選擇device logs進(jìn)行查看甥绿,如下圖,這些crash文件都可以導(dǎo)出來则披,然后再單獨(dú)對(duì)這個(gè)crash文件做處理分析共缕。

看日志

市場上已有的商業(yè)軟件提供crash收集服務(wù),這些軟件基本都提供了日志存儲(chǔ)收叶,日志符號(hào)化解析和服務(wù)端可視化管理等服務(wù):

Crashlytics (www.crashlytics.com)

Crittercism (www.crittercism.com)

Bugsense (www.bugsense.com)

HockeyApp (www.hockeyapp.NET)

Flurry(www.flurry.com)

開源的軟件也可以拿來收集crash日志骄呼,比如Razor,QuincyKit(Git鏈接)等,這些軟件收集crash的原理其實(shí)大同小異,都是根據(jù)系統(tǒng)產(chǎn)生的crash日志進(jìn)行了一次提取或封裝蜓萄,然后將封裝后的crash文件上傳到對(duì)應(yīng)的服務(wù)端進(jìn)行解析處理隅茎。很多商業(yè)軟件都采用了Plcrashreporter這個(gè)開源工具來上傳和解析crash,比如HockeyApp,Flurry和crittercism等嫉沽。

crash信息

由于自己的crash信息太長辟犀,找了一張示例:

1) crash標(biāo)識(shí)是應(yīng)用進(jìn)程產(chǎn)生crash時(shí)的一些標(biāo)識(shí)信息,它描述了該crash的唯一標(biāo)識(shí)(E838FEFB-ECF6-498C-8B35-D40F0F9FEAE4)绸硕,所發(fā)生的硬件設(shè)備類型(iphone3,1代表iphone4)堂竟,以及App進(jìn)程相關(guān)的信息等;

2)基本信息描述的是crash發(fā)生的時(shí)間和系統(tǒng)版本玻佩;

3)異常類型描述的是crash發(fā)生時(shí)拋出的異常類型和錯(cuò)誤碼出嘹;

4)線程回溯描述了crash發(fā)生時(shí)所有線程的回溯信息,每個(gè)線程在每一幀對(duì)應(yīng)的函數(shù)調(diào)用信息(這里由于空間限制沒有全部列出)咬崔;

5)二進(jìn)制映像是指crash發(fā)生時(shí)已加載的二進(jìn)制文件税稼。以上就是一份crash日志包含的所有信息,接下來就需要根據(jù)這些信息去解析定位導(dǎo)致crash發(fā)生的代碼邏輯垮斯, 這就需要用到符號(hào)化解析的過程(洋名叫:symbolication)郎仆。

解決線上閃退

首先保證,發(fā)布前充分測試兜蠕。發(fā)布后依然有閃退現(xiàn)象扰肌,查看崩潰日志,及時(shí)修復(fù)并發(fā)布熊杨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曙旭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猴凹,更是在濱河造成了極大的恐慌夷狰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊霎,死亡現(xiàn)場離奇詭異沼头,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)书劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門进倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人购对,你說我怎么就攤上這事猾昆。” “怎么了骡苞?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵垂蜗,是天一觀的道長楷扬。 經(jīng)常有香客問我,道長贴见,這世上最難降的妖魔是什么烘苹? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮片部,結(jié)果婚禮上镣衡,老公的妹妹穿的比我還像新娘。我一直安慰自己档悠,他們只是感情好廊鸥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辖所,像睡著了一般惰说。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缘回,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天助被,我揣著相機(jī)與錄音,去河邊找鬼切诀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搔弄,可吹牛的內(nèi)容都是我干的幅虑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼顾犹,長吁一口氣:“原來是場噩夢啊……” “哼倒庵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炫刷,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤擎宝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浑玛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍申,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年顾彰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了极阅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涨享,死狀恐怖筋搏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厕隧,我是刑警寧澤奔脐,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布俄周,位于F島的核電站,受9級(jí)特大地震影響髓迎,放射性物質(zhì)發(fā)生泄漏峦朗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一竖般、第九天 我趴在偏房一處隱蔽的房頂上張望甚垦。 院中可真熱鬧,春花似錦涣雕、人聲如沸艰亮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弯屈。三九已至跛蛋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俯画。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妓肢,地道東北人黔州。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像福澡,于是被迫代替她去往敵國和親叠赦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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