iOS崩潰日志分析

補(bǔ)充2個概念(來源掘金翻譯):

什么是 dSYM 文件

Xcode編譯項目后,我們會看到一個同名的 dSYM 文件,dSYM 是保存 16 進(jìn)制函數(shù)地址映射信息的中轉(zhuǎn)文件,我們調(diào)試的 symbols 都會包含在這個文件中,并且每次編譯項目的時候都會生成一個新的 dSYM 文件,位于 /Users/<用戶名>/Library/Developer/Xcode/Archives 目錄下,對于每一個發(fā)布版本我們都很有必要保存對應(yīng)的 Archives 文件 (AUTOMATICALLY SAVE THE DSYM FILES這篇文章介紹了通過腳本每次編譯后都自動保存 dSYM 文件)。

dSYM 文件有什么作用

當(dāng)我們軟件 release 模式打包或上線后,不會像我們在 Xcode 中那樣直觀的看到用崩潰的錯誤,這個時候我們就需要分析 crash report 文件了,iOS 設(shè)備中會有日志文件保存我們每個應(yīng)用出錯的函數(shù)內(nèi)存地址,通過 Xcode 的 Organizer 可以將 iOS 設(shè)備中的 DeviceLog 導(dǎo)出成 crash 文件,這個時候我們就可以通過出錯的函數(shù)地址去查詢 dSYM 文件中程序?qū)?yīng)的函數(shù)名和文件名。大前提是我們需要有軟件版本對應(yīng)的 dSYM 文件,這也是為什么我們很有必要保存每個發(fā)布版本的 Archives 文件了。


iOS崩潰日志分析,很多第三方sdk都有,也比較方便。但是個別時候,公司并不允許接入第三方,需要我們自己實現(xiàn)并且分析。下面就系統(tǒng)crash log來簡單介紹下怎么分析閃退點:


0? CoreFoundation? ? ? ? ? ? ? ? 0x3025cf7e __exceptionPreprocess + 126

1? libobjc.A.dylib? ? ? ? ? ? ? 0x3aad7cca objc_exception_throw + 34

2? CoreFoundation? ? ? ? ? ? ? ? 0x30193a34 -[__NSArrayI objectAtIndex:] + 172

3? iportal? ? ? ? ? ? ? ? ? ? ? 0x003c975c 0xa3000 + 3303260

4? iportal? ? ? ? ? ? ? ? ? ? ? 0x002882fc 0xa3000 + 1987324

一般閃退是這樣的,找到你項目首次出現(xiàn)的地方,以3為例,0x003c975c(代碼的內(nèi)存地址),0xa3000(應(yīng)用代碼的入口地址),3303260(代碼的內(nèi)存地址-應(yīng)用代碼的入口地址,即代碼的偏移地址)。

修正地址:不同的應(yīng)用包,其修正地址可能不一樣。修正地址的查看方法,使用otool命令查看

otool -arch armv7 -l ~/iportal.app/iportal

得到如下信息:

0x00004000

Load command 1

cmd LC_SEGMENT

cmdsize 736

segname __TEXT

vmaddr 0x00004000

vmsize 0x007cc000

fileoff 0

filesize 8175616

maxprot 0x00000005

initprot 0x00000005

nsects 10

flags 0x0

其中的LC_SEGMENT段的vmaddr(虛擬機(jī)入口地址)為修正地址。

使用dwarfdump 查看代碼符號信息。3303260 + 0x00004000 = 0x32a75c

dwarfdump --lookup=0x32a75c --arch=armv7 ~/iportal.app.dSYM |grep -E "start_addr:|Line table file:"

得到如下信息:

Line table file: 'AppDelegate.m' line 46, column 0 with start address 0x0000000000083e38

start_addr: 0x00083a58 -[AppDelegate application:didFinishLaunchingWithOptions:]


到這邊,就定位到代碼行和方法了??梢匀ジ腷ug了。

注意:不同架構(gòu)偏移量請分別計算,armv7 arm64以及armv7s

有疑問歡迎留言交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容