SIGABRT
一個(gè)數(shù)組越界報(bào)的崩潰場(chǎng)景

一點(diǎn)毛用都沒有,它并不能精確的定位到crash發(fā)生在哪個(gè)源文件哪行代碼中。為了精確的定位,我們可以使用Exception Breakpoint在Exception發(fā)生的時(shí)候暫停程序。


EXC_BAD_ACCESS的Crash
EXC_BAD_ACCESS 大部分是訪問已被釋放的內(nèi)存導(dǎo)致,與SIGABRT不同,發(fā)生EXC_BAD_ACCESS錯(cuò)誤時(shí),在控制臺(tái)里你不會(huì)得到一個(gè)錯(cuò)誤的信息。

但是你可以通過一些設(shè)置得到這些錯(cuò)誤信息并進(jìn)一步定位內(nèi)存錯(cuò)誤發(fā)生的位置??旖萱IShift+command+< ,調(diào)出Edit scheme視圖,勾選Enable zombie object,再次運(yùn)行,便有一些有用的信息提示。


message sent to deallocated instance 0x7fca5bca5690,這句話大概意思就是使用了一個(gè)被釋放的對(duì)象。注意:當(dāng)你把選項(xiàng)Zombie Objects打開的時(shí)候,你的應(yīng)用程序永遠(yuǎn)不會(huì)再釋放(dealloc)內(nèi)存,會(huì)導(dǎo)致不停的內(nèi)存泄漏并最終在某一時(shí)刻run out of free memory,所以不要一直開著Zombie Objects選項(xiàng),只有當(dāng)你定位EXC_BAD_ACCESS錯(cuò)誤的時(shí)候打開它,當(dāng)bug解決掉之后,立刻關(guān)閉它。
獲取Crash Log
很多測(cè)試人員在測(cè)試途中,或者開發(fā)者在自測(cè)的途中,會(huì)遇到APP crash的情況。一般的bug,一個(gè)合格的測(cè)試可以給出明確的重現(xiàn)步驟讓開發(fā)者清晰地知道bug原因;也有不少bug,很多時(shí)候是偶現(xiàn)的,很可能無法再次重現(xiàn)出來,無法重現(xiàn)出來的bug是開發(fā)者頭疼的,測(cè)試一般會(huì)給出bug的截圖和重現(xiàn)步驟;而一般crash是比較嚴(yán)重的問題了,這個(gè)時(shí)候崩潰日志就尤為重要了,把崩潰日志send給開發(fā)人員,如此才能讓開發(fā)者快速定位到錯(cuò)誤的原因和位置。
那么測(cè)試如何拿到crash日志呢?
- 方法一:設(shè)備與電腦上的iTunes Store同步后,會(huì)將崩潰日志保存在電腦上。根據(jù)電腦操作系統(tǒng)的不同,崩潰日志將保存在以下位置:
Mac : ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)一大堆的.crash文件和.ips文件

- 方法二:通過Xcode獲取到崩潰日志,方法是Xcode->Window->Devices

Crash Log的符號(hào)化
獲取到了.crash或者.ips文件的時(shí)候(憋糾結(jié)這兩個(gè)文件有什么差,改下后綴名就ok),用文本編輯器打開文件是一堆十六進(jìn)制的內(nèi)存地址,你會(huì)郁悶的發(fā)現(xiàn)壓根看不懂。點(diǎn)擊解讀

我在解析崩潰信息的時(shí)候,首先在桌面上建立一個(gè)Crash文件夾,然后將.Crash、.dSYM、symbolicatecrash放在這個(gè)文件夾中,這樣進(jìn)入這個(gè)文件夾下。
-
crash log的獲取
在上圖上右鍵你要導(dǎo)出的Crash文件日志。 - dSYM 符號(hào)集的獲取
我們每次Archive一個(gè)包之后,都會(huì)隨之生成一個(gè)dSYM文件。每次發(fā)布一個(gè)版本,我們都需要備份這個(gè)文件,以方便以后的調(diào)試。進(jìn)行崩潰信息符號(hào)化的時(shí)候,必須使用當(dāng)前應(yīng)用打包的電腦所生成的dSYM文件,其他電腦生成的文件可能會(huì)導(dǎo)致分析不準(zhǔn)確的問題。
選中archive的版本右擊,選擇Show in Finder就可以選中archived 文件然后顯示包內(nèi)容,就可以找到dSYM文件了。

-
symbolicatecrash 工具的獲取
symbolicatecrash,Xcode自帶的崩潰分析工具,使用這個(gè)工具可以更精確的定位崩潰所在的位置,將0x開頭的地址替換為響應(yīng)的代碼和具體行數(shù)。
symbolicatecrash我們可以在下面路徑下可以找到,我用的是Xcode7。
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
這樣三個(gè)文件都齊備好后,就開始進(jìn)行解析的工作了。

- ** 命令解析 **
開啟命令行工具,進(jìn)入崩潰文件夾crash中
cd /Users/自己MacPro上的名字/Desktop/崩潰文件夾crash
使用命令解析Crash文件,*號(hào)指的是具體的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功,使用命令檢查一下環(huán)境變量
xcode-select -print-path
返回結(jié)果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的結(jié)果,需要使用下面命令設(shè)置一下導(dǎo)出的環(huán)境變量,然后重復(fù)上面解析的操作。(這一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后會(huì)生成一個(gè)新的.Crash文件,這個(gè)文件中就是崩潰詳細(xì)信息。圖中紅色標(biāo)注的部分就是我們代碼崩潰的部分。

參考文章
命令行工具解析Crash文件,dSYM文件進(jìn)行符號(hào)化
iOS調(diào)試之 crash log分析
iOS應(yīng)用崩潰日志分析