異常分類
SIGABRT:異常終止條件铺然,例如abort()所發(fā)動者
SIGSEGV:非法內(nèi)存訪問(段錯誤)
SIGTERM: 發(fā)送給程序的終止請求
SIGINT: 外部中斷,通常為用戶所發(fā)動
SIGILL: 非法程序映像毛肋,例如非法指令
SIGFPE: 錯誤的算術(shù)運(yùn)算枫耳,例如除以零
0x8badf00d 表示app在一定時間內(nèi)無響應(yīng)被watchdog殺掉,對此類crash乏矾,應(yīng)該審查app在初始化時的操作是否正確,是否在主線程請求了網(wǎng)絡(luò)調(diào)用或者其他耗時的操作方法卡住了正常初始化流程迁杨。簡單來說就是看門狗超時钻心,在iOSapp上,經(jīng)常出現(xiàn)在執(zhí)行一個同步網(wǎng)絡(luò)請求調(diào)用而阻塞主線程的情況
0xdeadfa11 表示app被用戶強(qiáng)制退出
0xc00010ff 表示app因運(yùn)行溫度過高而被殺掉
Crash 日志從哪來铅协?一般有 2 個渠道:
蘋果收集的 Crash 日志
用戶手機(jī)上 設(shè)置 -> 隱私 -> 分析 里面的捷沸,可以連接電腦 Xcode 導(dǎo)出。
在 Xcode -> Window -> Organizer -> Crashes 里面可以查看
優(yōu)點: 理論上捕獲類型最全狐史,因為是 launchd 進(jìn)程捕獲的日志痒给。
缺點:不是全量日志,因為需要用戶隱私授權(quán)才會上報骏全,沒有數(shù)據(jù)化支撐苍柏。
自己應(yīng)用內(nèi)收集的
接入一些 APM 產(chǎn)品, 如 EMAS姜贡、mPaaS序仙、phabricator 等。
接入 PLCrashReporter 鲁豪、 KSCrash 等 SDK 進(jìn)行收集潘悼,上報到自建平臺統(tǒng)計
優(yōu)點:可以自建數(shù)據(jù)化支撐律秃,獲取 Crash 率等指標(biāo)。
缺點:存在無法捕獲的 Crash 的類型治唤。
Xcode 自動符號化
蘋果收集的日志棒动,Xcode會自動幫我們符號化,如果你沒有發(fā)布包宾添,比如是別人電腦打包的發(fā)布包船惨,或者是一些平臺上打的包,只需要你把 xcarchive 拷貝到 $HOME/Library/Developer/Xcode/Archives 目錄下之后缕陕,Xcode 就可以自動幫你符號化了粱锐。
手動符號化之 symbolicatecrash
“.app”, “.dSYM”和 ".crash"文件放到同一個目錄下
設(shè)置環(huán)境變量路徑
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
終端下執(zhí)行命令:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash iOS.crash iOS.app > iOS.log
使用命令行工具atos 解析iOS app的崩潰日志
在審核時或線上版本中經(jīng)常會出現(xiàn)各種離奇的崩潰,本文以命令行分析崩潰定位:
準(zhǔn)備:
1.崩潰日志文件:appName.crash
a.上線包可在iTunes connect 中下載crash文件扛邑。
b.在iPhone - “設(shè)置” - “隱私” - “分析” - “分析數(shù)據(jù)”中找到發(fā)生崩潰日志怜浅。
2.找到對應(yīng)的應(yīng)用的.dYSM,可在Xcode - windows - organize iOS app 對應(yīng)的archive蔬崩,右鍵 show in finder恶座,顯示包內(nèi)容下的dYSMs文件夾找到appName.app.dSYM
3.將appName.crash 和 appName.app.dSYM放到同一文件夾
4.打開終端,cd 到該文件夾
5.執(zhí)行
$ grep "appName arm" *crash 或 grep —after-context=2 “Binary Images:” *crash
查找crash模塊的加載地址
如下:
6.用atos命令來符號化某個特定的模塊加載地址:
xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName -l 0x104ae8000 -arch arm64
輸入完這個命令后如果沒有報錯沥阳,會進(jìn)入到一個帶輸入狀態(tài)跨琳,打開crash查看崩潰線程,如Triggered by Thread: 8為線程8桐罕,在出錯的線程里找到報錯的地址(app的第一行)如下圖:
7.將此出錯地址復(fù)制到終端可輸入地方脉让,解析出函數(shù):如圖
參考&引用&拓展閱讀
- 總線錯誤: https://zh.wikipedia.org/wiki/%E6%80%BB%E7%BA%BF%E9%94%99%E8%AF%AF
- 書籍:《深入解析 Mach OS X & iOS 操作系統(tǒng)》
- 崩潰捕獲系統(tǒng)的原理: https://junyixie.github.io/2019/09/28/CrashMonitorSystem/
- 分析iOS Crash文件: https://developer.aliyun.com/article/8854
- iOS開發(fā)同學(xué)的arm64入門: https://blog.cnbluebox.com/blog/2017/07/24/arm64-start/
- SIGSEGV 和 SIGBUS: https://www.cnblogs.com/charlesblc/p/6262783.html?spm=ata.13261165.0.0.26cd7529Cecpmj
- iOS 調(diào)試進(jìn)階: https://zhuanlan.zhihu.com/c_142064221
- KSCrash: https://github.com/kstenerud/KSCrash
- PLCrashReporter: https://github.com/microsoft/plcrashreporter