這篇文章會介紹定位閃退的幾種方法,由易到難進行介紹。當你手里關(guān)于閃退的信息越多,解決就越簡單,反之,就會更難。
首先解釋下符號化的概念:符號化就是解決把?;厮莸刂忿D(zhuǎn)化為為源碼方法名或函數(shù)名的過程。符號化完成后,崩潰日志中所有的十六進制地址都轉(zhuǎn)化為了方法名函數(shù)名,方便開發(fā)人員定位bug.
1、在第三方平臺或者自研apm平臺獲取符號化后的日志
前提:
項目集成的三方收集日志的平臺,或者有自研的apm平臺;
打包同學在該平臺上傳了dysm文件。
這種方法是最簡單的,也不用過多介紹。很多項目都集成了bugly、友盟等等,大公司都會有自己的一套APM平臺。
2、利用Xcode查看崩潰信息
前提:
開發(fā)者手里有發(fā)生崩潰的手機;
手機上的應(yīng)用是這臺電腦安裝打包。
選擇window-> devices -> 選擇自己的手機 -> view device logs 就可以查看手機上所有的崩潰信息了。如果是使用其他電腦進行的打包,可以在這里面將Crash文件導出,自己通過命令行的方式進行解析(見方法3)。
3、Mac自帶的命令行工具symbolicatecrash
前提:
symbolicatecrash工具;
.ips文件;
dSYM文件;
1、如何獲取symbolicatecrash工具?
右鍵Xcode,顯示包內(nèi)容,通過以下路徑找到:/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash.
2、如何獲取.ips文件
- 可以通過真機連Xcode 導出:Xcode>Window>Devices and Simulators>選擇已連接的真機>View Device Logs>xxxApp>右鍵導出.crash文件;
- 手機->設(shè)置->隱私->分析與改進->分析數(shù)據(jù),找到對應(yīng)時間點的日志;
3、如何獲取dysm文件?
找到打包的那臺機器,打開Xcode.Window -> Organizer -> Archives -> 選中需要導出dSYM的Archive右擊 -> Show in Finder -> 右鍵.xcarchive文件顯示包內(nèi)容 -> dSYMs文件夾
大公司的打包平臺下載app的地方,就有對應(yīng)的dysm文件。
拿到以上,三個文件后,放到一個統(tǒng)一文件夾里。命令行cd 到該文件下,執(zhí)行以下命令:
./symbolicatecrash xxxxx.ips xxxxx.app.dSYM > crash.log
此時該目錄下,就會多出一個crash.log的文件,里面放的就是符號化后的解析日志。
如果報錯 Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69. 需要 執(zhí)行命令
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
然后重新 輸入命令
./symbolicatecrash xxxxx.ips xxxxx.app.dSYM > crash.log
4、通過atos逐行解析堆棧
根據(jù)對應(yīng)的Binary Images 是項目自己的二進制還是系統(tǒng)動態(tài)庫來區(qū)分
1、是項目里的二進制
直接執(zhí)行命令:
atos -arch arm64 -o 二進制名(圖中的2) -l 首地址(后面對應(yīng)的短的那個) 偏移地址(后面對應(yīng)長的那個)
2、是系統(tǒng)的動態(tài)庫
這個時候要根據(jù)日志中的iOS版本信息(圖中的1) 去符號表目錄下載對應(yīng)版本的符號信息。
下載好對應(yīng)版本的符號信息,把日志里對應(yīng)的動態(tài)庫(圖片中的3)拷到一個單獨文件內(nèi),命令行cd到對應(yīng)文件夾,執(zhí)行命令:
atos -arch arm64 Foundation.framework/Foundation -l 0x1830bc000 0x0000000183109f94