iOS崩潰日志分析

什么是崩潰日志

iOS的App在崩潰時,系統(tǒng)會記錄下當前的每個線程的調用棧信息等等,并保存到設備中兔簇。這些信息匯總起來就是我們所說的崩潰日志塘装。

iOS崩潰日志收集的幾種方式

  1. 通過Xcode的Window > Devices進入設備管理,使用View Device Logs查看
  2. 通過第三方SDK上傳用戶的崩潰日志备图,比如使用友盟灿巧,BugHD,Bugly等等
  3. 通過Apple后臺搜集崩潰日志揽涮,可以在Organizer里直接查看線上的崩潰日志抠藕。但是如果用戶選擇不上傳診斷信息,就看不到日志了蒋困。

為什么要符號化

從iOS設備采集的原始崩潰日志記錄的都是調用棧地址

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x000000019959cb3c 0x19959c000 + 2876
1   libsystem_platform.dylib        0x0000000199679534 0x199674000 + 21812
2   libobjc.A.dylib                 0x0000000198c5b200 0x198c44000 + 94720
3   libobjc.A.dylib                 0x0000000198c6443c 0x198c44000 + 132156
4   CoreFoundation                  0x0000000184190cbc 0x184064000 + 1232060
......

這樣的崩潰日志是無法使用的盾似,通過符號化可以將它轉換成可讀的日志

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x000000019959cb3c syscall_thread_switch + 8
1   libsystem_platform.dylib        0x0000000199679534 _os_lock_handoff_lock_slow + 120
2   libobjc.A.dylib                 0x0000000198c5b200 spinlock_t::lockTwo(spinlock_t*, spinlock_t*) + 52
3   libobjc.A.dylib                 0x0000000198c6443c objc_storeWeakOrNil + 120
4   CoreFoundation                  0x0000000184190cbc _NSObjectStoreWeak + 80
5   CoreFoundation                  0x00000001841167f8 -[_CFXNotificationObjcObserverRegistration initWithObserver:parent:] + 92
......

怎樣符號化

大多數(shù)iOS程序員應該都知道使用View Device Logs查看設備日志時會自動符號化崩潰日志,但有時候可以符號化雪标,但有時候卻不行零院。
為什么呢?除了通過View Device Logs自動符號化文件村刨,還有沒有其他方式可以手動符號化崩潰日志呢告抄?下面會一一解答這些問題。

符號化的原理

dSYM文件

dSYM文件(符號文件)是存儲了類名和方法名等調試信息的文件嵌牺。在release模式下打洼,build后會有.app.dSYM文件。
debug模式下調試信息在可執(zhí)行文件中逆粹,所以不會生成dSYM文件募疮。符號化就是通過在dSYM文件查找地址對應的方法名來實現(xiàn)的。

Xcode的View Device Logs符號化時如何尋找符號文件

每個Crash日志都記錄了它所對應符號文件的uuid僻弹,打開一個crash文件酝锅,可以看到類似于下面這行的信息

Binary Images:    
0x10006c000 - 0x100073fff Demo1 arm64  <2cf1790547ff3a1cac055152319617ba> /var/mobile/Containers/Bundle/Application/7E6DE925-0B33-4699-89F7-05381876AD81/Demo1.app/Demo1

例子中的App名字是Demo1,符號文件所對應的uuid就是2cf1790547ff3a1cac055152319617ba奢方。當符號化這個崩潰日志的時候搔扁,符號化工具會通過這個uuid去尋找對應的dSYM文件爸舒,如果找到了就可以正確的符號化了。
由此我們就可以知道稿蹲,使用View Device Logs查看崩潰日志時扭勉,有時不能符號化的原因就是沒有查到對應的dSYM文件。因為每次build都會導致uuid發(fā)生變化苛聘,所以大部分的崩潰日志所對應的dSYM文件其實都被覆蓋掉了涂炎。

通過符號化命令行工具深入了解符號化的過程

在Xcode7.0中可以在一下路徑找到符號化命令行工具

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

可以為這個工具設置alias:

alias symbolicatecrash="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash"

這時候直接調用的話會報Error: "DEVELOPER_DIR" is not defined at ...這樣的錯誤,只要設置環(huán)境變量DEVELOPER_DIR就行了 设哗。
export 'DEVELOPER_DIR'="/Applications/Xcode.app/Contents/Developer"

后面我都會直接使用symbolicatecrash進行命令行下的符號化

Xcode就是通過這個工具符號化崩潰日志的

在符號化之前我們先準備好幾樣東西:
  1. 原始的崩潰日志
  2. dSYM文件
  3. symbolicatecrash可執(zhí)行文件

我們先查看crash日志是否和符號文件是匹配的唱捣,下面的命令將提取dSYM文件的uuid

xcrun dwarfdump --uuid Demo1.app.dSYM/Contents/Resources/DWARF/Demo1

我提取出來的uuid是:

UUID: 2CF17905-47FF-3A1C-AC05-5152319617BA (arm64) Demo1.app.dSYM/Contents/Resources/DWARF/Demo1

崩潰日志的uuid是:

0x10006c000 - 0x100073fff Demo1 arm64  <2cf1790547ff3a1cac055152319617ba> /var/mobile/Containers/Bundle/Application/7E6DE925-0B33-4699-89F7-05381876AD81/Demo1.app/Demo1

都是 2cf1790547ff3a1cac055152319617ba,所以使用這個dSYM文件既可以符號化上面的崩潰日志。

用symbolicatecrash來符號化崩潰日志
symbolicatecrash demo1.crash Demo1.app.dSYM -o processed.crash

符號化后的crash文件將會被寫入processed.crash中,
然后我們來看看如果把Demo1.app.dSYM去掉會怎樣,為了看到符號化的過程网梢,我們可以加上 -v

symbolicatecrash demo1.crash -o processed.crash -v

我們主要看Demo1的符號化過程震缭,其他系統(tǒng)調用其實也會在這個過程中被符號化。#后面是我添加的注釋

-- [2cf1790547ff3a1cac055152319617ba] fetching symbol file for Demo1    #開始尋找Demo1的符號文件    
Running mdfind "com_apple_xcode_dsym_uuids == 2CF17905-47FF-3A1C-AC05-5152319617BA"    #使用Spotlight 搜索uuid為2CF17905-47FF-3A1C-AC05-5152319617BA的dsym文件    
#接下來是使用file,lipo,otool等來分析dSYM的相關信息
.
.
-- [2cf1790547ff3a1cac055152319617ba] MATCH (spotlight): ...  #確認找到對應的dSYM文件
.
.
atos -arch arm64 -l 0x10006c000 -o '..../Demo1.app.dSYM/Contents/Resources/DWARF/Demo1' 0x00000001000706e8 0x0000000100070a80

我們看到最后會發(fā)現(xiàn)實際上symbolicatecrash是使用atos來尋找調用棧地址對應的調試符號的战虏。

我們來看一下atos所使用的參數(shù):

  1. -arch 所運行設備的架構拣宰,有arm64,armv7等等
  2. -l 二進制鏡像運行時加載的地址
  3. -o 后面是符號文件或者含有調試符號的可執(zhí)行文件(debug編譯所產生的可執(zhí)行文件默認是包含調試符號的)烦感。
  4. 再后面就是需要符號化的調用棧地址巡社,5 Demo1 0x00000001000706e8 0x10006c000 + 18152,0x00000001000706e8就是其中的一個地址。

二進制鏡像運行時加載的地址通過如下方式獲得

Binary Images:        
0x10006c000 - 0x100073fff Demo1 arm64  <2cf1790547ff3a1cac055152319617ba> /var/mobile/Containers/Bundle/Application/7E6DE925-0B33-4699-89F7-05381876AD81/Demo1.app/Demo1

中的0x10006c000就是這個崩潰日志所對應的二進制鏡像加載地址手趣。

綜上所述晌该,symbolicatecrash主要幫我們做了兩件事情,匹配到對應的dSYM文件绿渣,使用atos符號化每個調用棧地址朝群。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怯晕,隨后出現(xiàn)的幾起案子潜圃,更是在濱河造成了極大的恐慌缸棵,老刑警劉巖舟茶,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堵第,居然都是意外死亡吧凉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門踏志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阀捅,“玉大人,你說我怎么就攤上這事针余∷潜桑” “怎么了凄诞?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忍级。 經常有香客問我帆谍,道長,這世上最難降的妖魔是什么轴咱? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任汛蝙,我火速辦了婚禮,結果婚禮上朴肺,老公的妹妹穿的比我還像新娘窖剑。我一直安慰自己,他們只是感情好戈稿,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布西土。 她就那樣靜靜地躺著,像睡著了一般器瘪。 火紅的嫁衣襯著肌膚如雪翠储。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天橡疼,我揣著相機與錄音援所,去河邊找鬼。 笑死欣除,一個胖子當著我的面吹牛住拭,可吹牛的內容都是我干的。 我是一名探鬼主播历帚,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼滔岳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挽牢?” 一聲冷哼從身側響起谱煤,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禽拔,沒想到半個月后刘离,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睹栖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年硫惕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野来。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡恼除,死狀恐怖,靈堂內的尸體忽然破棺而出曼氛,到底是詐尸還是另有隱情豁辉,我是刑警寧澤令野,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站徽级,受9級特大地震影響彩掐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜灰追,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一堵幽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弹澎,春花似錦乍恐、人聲如沸衡怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽换团。三九已至曼尊,卻和暖如春菲盾,著一層夾襖步出監(jiān)牢的瞬間昏兆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工报强, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灸姊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓秉溉,卻偏偏與公主長得像力惯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子召嘶,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • 1. 手機連接電腦父晶,打開Xcode的Devices列表,找到崩潰app的iphone弄跌。選中Device Logs甲喝,...
    CRAZYBADAM閱讀 382評論 0 0
  • 之前整理了一篇文章,寫的是在本地搭建IPV6環(huán)境,搭建完成之后,發(fā)現(xiàn)我的APP沒有問題,于是,我只能從審核給返回的...
    和影子玩拳擊閱讀 967評論 0 0
  • 作為一名自認為很牛逼的程序員,當你發(fā)現(xiàn)bug時你的內心世界是這樣的: 當你定位到bug铛只,并花了一晚上把它改好埠胖,發(fā)現(xiàn)...
    穿山甲救蛇精閱讀 12,932評論 10 74
  • 該文章屬于劉小壯原創(chuàng),轉載請注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 37,539評論 45 122
  • Caring teacher, must have trust in ACTS son only absolute...
    夢醒耳畔她輕言閱讀 172評論 1 0