iOSCrash log分析

作為一名應用開發者,相信你經常碰到以下情景:

在你將應用提交到App Store之前,想必你已經做了大量的測試工作,在你的設備上它也運行的很好,然而,還是會出現使用時閃退的情況。相信大家已經做好了Crash log的收集工作。

Crash log主要分為兩種情況:
1.連接真機進行調試
2.App Store上應用的Bug追蹤

本文主要講的是App Store上bug的分析。

image.png

上圖正是Apple給的崩潰日志,下面我們逐步分析一下日志的內容。

1.進程信息
Incident Identifier:crash的id
CrashReporter Key:crash的設備id
Hardware Model:手機型號
Process:[app名字] [進程ID]
Path:app的位置
Identifier:bundle ID
Version:版本號
AppStoreTools
Code Type:arm64
Role:app處于前臺
Parent Process
Coalition

2.基本信息
Date/Time:crash發生時間
Launch Time:app啟動時間
OS Version:iOS版本
Release Type
Baseband Version
Report Version

3.異常信息
Exception Type:異常類型
Exception Codes:異常地址
Exception Note:描述
Triggered by Thread:異常發生的線程

4.異常回溯
發生異常時的線程堆棧

分析工具symbolicatecrash和atos

image.png

我們發現crash log上都是一些地址,根本不是我們所熟悉的代碼,這時候我們就要借助symbolicatecrashatos進行分析。

在分析之前需要準備dSYM文件,crash logsymbolicatecrash(Xcode自帶的崩潰分析工具)。

什么是dSYM文件?
Xcode編譯項目后,我們會看到一個同名的 dSYM 文件,dSYM 是保存 16 進制函數地址映射信息的中轉文件,我們調試的 symbols 都會包含在這個文件中,并且每次編譯項目的時候都會生成一個新的 dSYM 文件,位于 /Users/用戶名/Library/Developer/Xcode/Archives 目錄下,對于每一個發布版本我們都很有必要保存對應的 Archives文件

dSYM文件作用
我們可以通過crash log中出錯的函數地址去查詢 dSYM 文件中程序對應的函數名和文件名

symbolicatecrash

1.在桌面新建一個文件夾crashtemp

  1. 找到symbolicatecrash工具 終端輸入
find /Applications/Xcode.app -name symbolicatecrash -type f

找到"symbolicatecrash" 文件, 拷貝到剛才創建的 "crashtemp" 文件夾里。

3.Xcode->Window->Organizer->Archives 顯示包內容獲取dSYM文件拷貝到剛才創建的 "crashtemp" 文件夾里。

4.crash log文件拷貝到crashtemp里。

5.打開終端進入crashtemp文件夾:

cd /Users/username/Desktop/crashtemp

6.檢驗crash、dSYM文件是否匹配
每一個xx.app.dSYM 文件都有對應的 UUID,crash 文件也有自己的 UUID,只要這三個文件的 UUID 一致,我們就可以通過他們解析出正確的錯誤函數信息了。

在 terminal 中輸入以下命令,查看UUID:

dwarfdump --uuid xx.app/xx //查看.app的UUID(xx代表你的項目名)
dwarfdump --uuid xx.app.dSYM  // 查看.dSYM的UUID


crash 文件內第一行 Incident Identifier 就是該 crash 文件的 UUID

7.輸入以下命令

export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash //*是文件名

這時候終端將會進行處理......
生成一個新的文件symbol.crash,這就是我們認識的crash文件。

atos

有時候通過symbolicatecrash并不能解析出來崩潰信息,或者APP自身的堆棧能解析出來,但是系統的堆棧解析不出來。

可以通過atos命令逐行解析,通過這個命令可以解析指定的某一行堆棧。

atos -o yourAppName.app.dSYM/Contents/Resources/DWARF/yourAppName -arch arm64/armv7 -l <load-address> <address>

load-address:報錯地址
address:鏡像的首地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容