1、crash文件的獲取
設(shè)備與電腦上的iTunes Store同步后,會(huì)將崩潰日志保存在電腦上。根據(jù)電腦操作系統(tǒng)的不同侨赡,崩潰日志將保存在以下位置:
Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/
Windows XP: C:Documents and Settings<USERNAME>Application DataApple ComputerLogsCrashReporterMobileDevice<DEVICE_NAME>
Windows Vista or 7: C:Users<USERNAME>AppDataRoamingApple ComputerLogsCrashReporterMobileDevice<DEVICE_NAME>
當(dāng)用戶抱怨閃退時(shí),你可以要求他讓設(shè)備與iTunes同步粱侣,并根據(jù)操作系統(tǒng)的不同羊壹,到上述位置把崩潰日志下載下來(lái),然后通過電子郵件發(fā)送給你齐婴。
2油猫、crash文件的符號(hào)化
將十六進(jìn)制地址轉(zhuǎn)化成方法名稱和行數(shù)的過程稱之為Symbolication(符號(hào)化)。
(1) 利用Xcode的Devices and Simulators
只要把.crash文件拉到Xcode的device log里面尔店,然后幾秒鐘后就會(huì)符號(hào)化眨攘。但是這里有個(gè)前提主慰,就是這個(gè)發(fā)生crash的版本包必須是你自己的Xcode里面Archive出來(lái)的(這個(gè)是蘋果自帶的方法嚣州,會(huì)自動(dòng)檢測(cè)是否含有匹配的.dSYM文件和應(yīng)用二進(jìn)制文件)。
那如果要是在新電腦上也想符號(hào)化怎么辦共螺?只有相匹配的.dSYM文件和應(yīng)用二進(jìn)制文件就可以符號(hào)化该肴。必需完全匹配才行。否則藐不,日志將無(wú)法被完全符號(hào)化匀哄。應(yīng)用的二進(jìn)制文件就是打的包得.ipa后綴改成.zip秦效,然后解壓后里面有個(gè).app文件就是應(yīng)用的二進(jìn)制文件。將.dSYM文件與.app文件 和.crash文件放一個(gè)目錄下涎嚼,然后再用deviceLog方法就可以符號(hào)化了阱州。
(2) 利用Symbolicatecrash命令行工具
如果想查看.crash文件的廬山真面目,需要找出在上傳應(yīng)用時(shí)所發(fā)送的.app和.dSYM文件法梯,切記每次發(fā)送新版本都要保留這兩個(gè)文件苔货,不然沒有辦法解析Crash Log的×⒀疲可以先把這兩個(gè)文件拷貝到桌面的某一個(gè)文件夾中夜惭,然后把.crash的文件也拷貝的同一個(gè)文件夾下。
這一解析過程需要使用Symbolicatecrash來(lái)完成铛绰,首先要找到Symbolicatecrash文件诈茧,xcode5.0在 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/ Symbolicatecrash文件獨(dú)立于Xcode,可以拷到剛才放crash log的文件夾中使用捂掰,在開始解析之前需要先進(jìn)行一些校驗(yàn):
查看xx.app文件的uuid的方法,在命令行中輸入:
dwarfdump --uuid xxx.app/xxx (xxx工程名)查看xx.app.dSYM文件的uuid的方法敢会,在命令行輸入:
dwarfdump --uuid xxx.app.dSYM (xxx工程名)
3.查看.crash的uuid,位于crash日志中的Binary Images:中的第一行尘颓。如:armv7s <13760bde0d073f1eb4d596c3df753f4b>
只有三者的uuid相同才能解析.crash文件走触,然后在命令行輸入:
./symbolicatecrash xxx.crash xxx.app.dSYM > test.log
這樣可以將.crash日志轉(zhuǎn)換成test.log,test.log即可讀的函數(shù)文件疤苹。輸入上述命令可能會(huì)出現(xiàn)Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 53.這個(gè)錯(cuò)誤互广。如果出現(xiàn)上述錯(cuò)誤,輸入命令:export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer卧土,然后繼續(xù)執(zhí)行./symbolicatecrash xxx.crash xxx.app.dSYM > test.log可以成功
3惫皱、crash log分析
Incident Identifier:當(dāng)前crash的 id,可以區(qū)分不同的crash事件
CrashReporter Key: 當(dāng)前設(shè)備的id尤莺,可以判斷crash在某一設(shè)備上出現(xiàn)的頻率
Hardware Model: 設(shè)備型號(hào)
Process: 當(dāng)前應(yīng)用的名稱旅敷,后面中括號(hào)中為當(dāng)前的應(yīng)用在系統(tǒng)中的進(jìn)程id
Path: 當(dāng)前應(yīng)用在設(shè)備中的路徑
Identifier:
bundle idVersion: 應(yīng)用版本號(hào)
Code Type: (還不清楚)
Date/Time: crash事件 時(shí)間
OS Version: 當(dāng)前系統(tǒng)版本
Exception Type: 異常類型
Exception Codes: 異常出錯(cuò)的代碼
Triggered by Thread: 在某一個(gè)線程出了問題導(dǎo)致crash,Thread 0 為主線程颤霎、其它的都為子線程
Last Exception Backtrace: 最后異诚彼回溯,一般根據(jù)這個(gè)代碼就能找到crash的具體問題
(1) Crash Log分類
如果所有的CrashLog已經(jīng)被采集下來(lái)了友酱,為了避免重復(fù)解決相同的bug晴音,這個(gè)時(shí)候就需要所有的CrashLog分類,通過上面已有的信息缔杉,就可以對(duì)CrashLog做如下的分類控制:
- 通過設(shè)備id查找當(dāng)前設(shè)備上出現(xiàn)的crash(通過CrashReporter Key)锤躁;
- 查找所有在iphone5上出現(xiàn)的crash(通過Hardware Model);
- 查找所有在ios7.1上出現(xiàn)的crash(通過OS Version)或详;
- 查找所有在應(yīng)用1.0版本上出現(xiàn)的crash(通過 Version)系羞;
- 查看在某一個(gè)時(shí)間段內(nèi)出現(xiàn)的crash(通過 Date/Time)郭计;
- 查找所有因?yàn)閮?nèi)存問題出現(xiàn)的crash (通過 Exception Type);
- 查找在主線程出現(xiàn)crash的問題(Triggered by Thread == 0);
- 對(duì)上述條件的組合查詢椒振;
(2) Exception Type
1)EXC_BAD_ACCESS
此類型的Excpetion是我們最長(zhǎng)碰到的Crash昭伸,通常用于訪問了不改訪問的內(nèi)存導(dǎo)致。一般EXC_BAD_ACCESS后面的"()"還會(huì)帶有補(bǔ)充信息澎迎。
SIGSEGV: 通常由于重復(fù)釋放對(duì)象導(dǎo)致勋乾,這種類型在切換了ARC以后應(yīng)該已經(jīng)很少見到了。
SIGABRT: 收到Abort信號(hào)退出嗡善,通常Foundation庫(kù)中的容器為了保護(hù)狀態(tài)正常會(huì)做一些檢測(cè)辑莫,例如插入nil到數(shù)組中等會(huì)遇到此類錯(cuò)誤。
SEGV:(Segmentation Violation)罩引,代表無(wú)效內(nèi)存地址各吨,比如空指針,未初始化指針袁铐,棧溢出等揭蜒;
SIGBUS:總線錯(cuò)誤,與 SIGSEGV 不同的是剔桨,SIGSEGV 訪問的是無(wú)效地址屉更,而 SIGBUS 訪問的是有效地址,但總線訪問異常(如地址對(duì)齊問題)
SIGILL:嘗試執(zhí)行非法的指令洒缀,可能不被識(shí)別或者沒有權(quán)限
2)EXC_BAD_INSTRUCTION
此類異常通常由于線程執(zhí)行非法指令導(dǎo)致
3)EXC_ARITHMETIC
除零錯(cuò)誤會(huì)拋出此類異常
(3) Exception Code
0xbaaaaaad錯(cuò)誤碼:用戶按住Home鍵和音量鍵瑰谜,獲取當(dāng)前內(nèi)存狀態(tài),不代表崩潰树绩。
0xbad22222錯(cuò)誤碼:當(dāng)VOIP程序在后臺(tái)太過頻繁的激活時(shí)被iOS干掉萨脑。
0x8badf00d錯(cuò)誤碼:程序啟動(dòng)或者恢復(fù)時(shí)間過長(zhǎng)被watch dog終止,意為“ate bad food”饺饭。
0xc00010ff錯(cuò)誤碼:程序執(zhí)行大量耗費(fèi)CPU和GPU的運(yùn)算渤早,導(dǎo)致設(shè)備過熱,觸發(fā)系統(tǒng)過熱保護(hù)被系統(tǒng)終止瘫俊,意為“cool off”鹊杖。
0xdead10cc錯(cuò)誤碼:因?yàn)樵诤笈_(tái)時(shí)仍然占據(jù)系統(tǒng)資源(比如通訊錄)被干掉,意為“dead lock”扛芽。
0xdeadfa11錯(cuò)誤碼:用戶強(qiáng)制退出骂蓖,意為“dead fall”。