當(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
1.應(yīng)用邏輯的Bug
- 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ò)誤等
2.違反iOS系統(tǒng)規(guī)則產(chǎn)生crash的三種類型
-
內(nèi)存報(bào)警閃退
- 當(dāng)iOS檢測(cè)到內(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模塊庫(kù)來發(fā)現(xiàn)內(nèi)存分配問題和內(nèi)存泄漏問題。
-
響應(yīng)超時(shí)
- 當(dāng)應(yīng)用程序?qū)σ恍┨囟ǖ氖录ū热鐔?dòng)、掛起、恢復(fù)、結(jié)束)響應(yīng)不及時(shí),蘋果的Watchdog機(jī)制會(huì)把應(yīng)用程序干掉,并生成一份相應(yīng)的crash日志。
-
用戶強(qiáng)制退出
- 一看到“用戶強(qiáng)制退出”,首先可能想到的雙擊Home鍵,然后關(guān)閉應(yīng)用程序。不過這種場(chǎ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í)這種場(chǎng)景才會(huì)產(chǎn)生crash日志。這里指的“用戶強(qiáng)制退出”場(chǎng)景,是稍微比較復(fù)雜點(diǎn)的操作:先按住電源鍵,直到出現(xiàn)“滑動(dòng)關(guān)機(jī)”的界面時(shí),再按住Home鍵,這時(shí)候當(dāng)前應(yīng)用程序會(huì)被終止掉,并且產(chǎn)生一份相應(yīng)事件的crash日志。
更多:iOS面試題合集