今天搗鼓了一天的crash日志終于順利的把16進(jìn)制的堆棧信息還原了笤成,特地來寫個簡書檀头。每個iOS肯定都很羨慕Android的崩潰日志,直接定位到錯誤代碼的位置铝穷,讓你快速定位BUG敦迄,iOS一出現(xiàn)bug就會出現(xiàn)一堆的16進(jìn)制地址恋追,讓人類無法閱讀,今天索性研究了一天,來跟大家分享下如何把這些16進(jìn)制還原成對應(yīng)的代碼位置罚屋,像java一樣定位bug苦囱。
首先來普及下幾個小知識:
1.什么是符號表
符號表就是指在Xcode項(xiàng)目編譯后,在編譯生成的二進(jìn)制文件.app的同級目錄下生成的同名的.dSYM文件.dSYM文件其實(shí)是一個目錄脾猛,在子目錄中包含了一個16進(jìn)制的保存函數(shù)地址映射信息的中轉(zhuǎn)文件撕彤,所有Debug的symbols都在這個文件中(包括文件名、函數(shù)名猛拴、行號等)羹铅,所以也稱之為調(diào)試符號信息文件。
2.符號表有什么用
符號表就是用來符號化 crash log(崩潰日志)愉昆。crash log中有一些方法16進(jìn)制的內(nèi)存地址等职员,通過符號表就能找到對應(yīng)的能夠直觀看到的方法名之類。
3.如何得到.dsYM文件
我們在Archive的時候會生成.xcarchive文件跛溉,然后顯示包內(nèi)容就能夠在里面找到.dsYM文件和.app文件焊切。
下圖是線上收集的bug崩潰信息
花紅圈的地方就我的APP報錯的位置信息,在你們的日志里tcrrdios應(yīng)該是你們對應(yīng)的appname,后面緊跟的是2個16進(jìn)制地址芳室。
解析上面這點(diǎn)信息首先獲取APP編譯時的.xcarchive
OK,以上步驟就可以得到你的.xcarchive专肪。什么?你沒有堪侯?編譯后就刪除了嚎尤?那你就只能等下次了,這個文件沒發(fā)布一次版本最好保存起來防止日后出現(xiàn)問題找到問題的代碼伍宦。
找到了你的.xcarchive右擊“顯示包內(nèi)容”---“dSYMs”-----“[你的appname].app.dSYM”---右擊"顯示包內(nèi)容"---"Contents"-----"Resources"----"DWARF"芽死。這時你會看到和你APPNAME一樣的文件,打開命令行輸入atos -o [拖動地址到這里] -l [16進(jìn)制地址] -arch arm64 [16進(jìn)制地址]雹拄。
以我的文件為例最終命令為:
atos -o /Users/lr_ios1/Desktop/a/tcrrdios.app.dSYM/Contents/Resources/DWARF/tcrrdios-l 0x0000000100030000 -arch arm64 0x00000001000507f4
注意空格J毡肌U莆亍滓玖!注意空格!V式丁势篡!注意空格t婕 !禁悠!重要的事情要說三遍
arm64是根據(jù)你實(shí)際CPU類型念祭,這個現(xiàn)在基本都是64位的了,5以下的機(jī)型就是armv7碍侦。
執(zhí)行完上面的命令得到的結(jié)果是:
-[MainViewController viewDidLoad] (in tcrrdios) (MainViewController.m:31)
這個返回值的意思大家應(yīng)該都能看得懂了粱坤,發(fā)生崩潰的位置就是MainViewController.m這個文件的31行,也就是MainViewController這個類的viewDidLoad函數(shù)中瓷产。
來張圖吧站玄。。濒旦。株旷。
到這里我相信小白也能看得懂了。其實(shí)我也是小白o(hù)(>﹏<)o尔邓。晾剖。。
什么梯嗽?還是太難齿尽?好吧,介紹你們一種圖形界面的方法灯节,炒雞簡單雕什,我就不詳細(xì)介紹了,
https://github.com/answer-huang/dSYMTools
對就是上面的地址显晶,作者已經(jīng)把源碼開源了贷岸,圖形化定位代碼位置夠簡單了吧,上面有操作方法磷雇。
順便提供下下載地址:
https://pan.baidu.com/s/1mg01Qha