符號化iOS崩潰報告

最近看到一篇關(guān)于符號化iOS崩潰報告的文章挺好胜榔,決定翻一下家乘,下方鏈接是原文地址:

https://possiblemobile.com/2015/03/symbolicating-your-ios-crash-reports/

開始

你已經(jīng)遞交你的應(yīng)用程序的崩潰報告,但是棧回溯包含了難懂的內(nèi)存地址寻咒。開發(fā)者該怎么辦?簡而言之灰粮,你需要調(diào)試符號來應(yīng)用于堆棧追蹤仔涩,從而使它人類可讀,這個過程我們稱作符號化粘舟。

在開始之前熔脂,我們依照使用Crasher,它提供了一個簡單崩潰報告柑肴,讓你破譯霞揉。

你應(yīng)該有.crash文件。如果沒有晰骑,你可以從iTunes Connect中攫取适秩,或者直接通過Xcode從連接的設(shè)備中攫取(Windows > Devices),或在一個連接的設(shè)備(Settings > Privacy > Diagnostics & Usage),或使用 PLCrashReporter 框架硕舆。你可能已經(jīng)使用了第三方的崩潰報告服務(wù)秽荞,在你配置正確后,它將符號化你的崩潰抚官。

根據(jù)你的應(yīng)用創(chuàng)建是如何配置的扬跋,你需要一個或者全部下面的東西:

0.導致崩潰的應(yīng)用程序構(gòu)建的.app文件。這個包包含了應(yīng)用二進制文件凌节,以及可能包含測試符號钦听。(如果你有一個.ipa文件洒试,你可以把它當做一個.zip文件,通過解壓這個文件把它提取出來)

1.導致崩潰的應(yīng)用程序構(gòu)建的.dSYM文件朴上。這是你的應(yīng)用程序的副產(chǎn)品垒棋,包含調(diào)試符號化。

你需要哪一個? 在 Xcode中痪宰,查找Build Setting里的 "Strip Debug Symbols During Copy"(COPY_PHASE_STRIP)叼架。當允許時,調(diào)試符號將會從你的.app省去衣撬,把它放到了.dSYM文件碉碉。否則你的.app包含這些符號。(默認情況下淮韭, 由于某些不清楚的原因垢粮,調(diào)試符號從釋放的創(chuàng)建中剝離,你可能不應(yīng)該改變這個發(fā)布配置)

但是等等靠粪,什么是調(diào)試符號蜡吧?

為了讓調(diào)試符號變成人類可讀的即程序員給方法命名的名稱,編譯器通過使用它自己的符號來減少這些命名的調(diào)試符號占键,從而使代碼模糊昔善。即使兩次相同代碼創(chuàng)建,你也不能依賴這些符號畔乙。

檢查崩潰

如果通過Xcode的Organizer從設(shè)備中提交崩潰報告君仆,你的崩潰報告可能將會對UIKit和其他iOS框架自動符號化。如果Xcode知道你的創(chuàng)建牲距,他將自動符號化你的崩潰返咱。

如果不是這種情況,你需要自己符號化牍鞠。

使用"Symbolicatecrash"工具來符號化

幸運的是咖摹,蘋果提供給了我們腳本來檢索調(diào)試符號化,將他們應(yīng)用于崩潰報告难述。

對 Xcode 6萤晴,你可以在下面目錄里找到這個工具:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/Current/Resources/symbolicatecrash

或者如果你使用的是Xcode 5 從下方路徑獲得:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/Current/Resources/symbolicatecrash

為了使用這個工具,你需要用安裝Xcode恰當路徑導出 DEVELOPER_DIR 環(huán)境變量:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"  

把你的.crash文件.app文件和.dSYM文件放在同一個目錄下然后運行:

symbolicatecrash -v ScaryCrash.crash > Symbolicated.crash

你可能需要顯示應(yīng)用應(yīng)用程序二進制:

symbolicatecrash -v ScaryCrash.crash ./Crasher.app/Crasher > Symbolicated.crash

如果你使用在Crasher例子中發(fā)現(xiàn)的便利腳本胁后,需要冗長的標記:

sh symbolicate6.sh ScaryCrash.crash ./Crasher.app/Crasher > Symbolicated.crash

如果你使用在Crasher例子中發(fā)現(xiàn)的便利腳本店读,需要冗長的標記:

sh symbolicate6.sh ScaryCrash.crash ./Crasher.app/Crasher > Symbolicated.crash

驗證符號化

如果符號化不能工作,仔細檢查你攫取的.dSYM或者.app文件是否正確攀芯。你可以通過交叉引用崩潰的報告中的UUID和應(yīng)用程序二進制中的UUID:

dwarfdump –uuid Crasher.app/Crasher

結(jié)果:

1.png

在dSYM文件中:

dwarfdump –uuid Crasher.app.dSYM/Contents/Resources/DWARF/Crasher

結(jié)果:

2.png

和你的崩潰報告中的UUID進行比較:

3.png

從symbolicatecrash工具冗長的日志里屯断,同樣列出它找出的UUID。

排查 "Symbolicatecrash" 工具

如果你還是困惑,請認真檢查symbolication日志裹纳。symbolication工具嘗試找出你應(yīng)用中與UUID相匹配的相應(yīng)文件以及每個動態(tài)框架,尋找著你的應(yīng)用程序名稱或者UUID 并看出是否匹配紧武。

4.png

如果Spotlight不能找到你的.dSYM文件剃氧,你可能碰到這樣一個日志樣例:

5.png

或者有一個無效的.dSYM:

6.png

或者有任何其他無效的輸入:

7.png

在Xcode 6 版本中的symbolicatecrash工具嘗試解決一些再Xcode 5 版本中面臨的Spotlight問題。如果你遇到問題阻星,他可能是Spotlight中一個文件的索引問題朋鞍,嘗試:

mdimport -g /Applications/Xcode.app/Contents/Library/Spotlight/uuid.mdimporter . 

使用命令行工具鏈

我們可以深入 和使用開發(fā)者命令行工具鏈來一行行的符號化棧追蹤的內(nèi)存地址。如果你在過去使用這個方法中遇到問題妥箕,那可能是因為在最近幾年.crash文件根式改變了滥酥。

首先,讓我們再看看我們崩潰報考中的棧追蹤:

8.png

最左邊的十六進制值畦幢,0x000aeef6,是棧地址坎吻。第二個十六進制值,0xa8000,是應(yīng)用程序的加載地址宇葱。以加號為開始的數(shù)字瘦真,28406,是棧地址和加載地址的差值黍瞧。 0x00aeef6 = 0xa8000 + 0x6EF6
诸尽。你將會發(fā)現(xiàn)在我們的崩潰報告底部的“Binary Images”,它是動態(tài)庫內(nèi)存地址范圍列表印颤。我們的二進制文件的起始地址在堆棧跟蹤加載地址相匹配您机。

9.png

下一步,為了更好的測量年局,我們將驗證可執(zhí)行文件包含蹦潰的架構(gòu)际看,不論使用file或者lipo -info命令:

file Crasher.app/Crasher

結(jié)果:

10.png

現(xiàn)在我們?nèi)蔽溲b。我們經(jīng)查實atos命令來將我們的地址轉(zhuǎn)換成調(diào)試符號矢否。注意我們?nèi)绾翁峁┘虞d地址仿村,它在我們指定崩潰的架構(gòu)的棧地址后面:

atos -arch armv7 -o Crasher.app/Crasher -l 0xa8000 0x000aeef6  

結(jié)果:

11.png

就是這樣。如果你有興趣繼續(xù)鉆研兴喂,研讀Mach-O對象文件格式以及Mach-O命令行實用工具蔼囊,也就是otool和lipo命令。

更多閱讀

更多全面的文檔衣迷,請查看:
Technical Note TN2151: Understanding and Analyzing iOS Application Crash Reports
Technical Q&A QA1765: How to Match a Crash Report to a Build
Mach-O Programming Topics
Objc.io on Mach-O Executables

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畏鼓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子壶谒,更是在濱河造成了極大的恐慌云矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汗菜,死亡現(xiàn)場離奇詭異让禀,居然都是意外死亡挑社,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門巡揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痛阻,“玉大人,你說我怎么就攤上這事腮敌≮宓保” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵糜工,是天一觀的道長弊添。 經(jīng)常有香客問我,道長捌木,這世上最難降的妖魔是什么油坝? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮刨裆,結(jié)果婚禮上免钻,老公的妹妹穿的比我還像新娘。我一直安慰自己崔拥,他們只是感情好极舔,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著链瓦,像睡著了一般拆魏。 火紅的嫁衣襯著肌膚如雪外莲。 梳的紋絲不亂的頭發(fā)上懂傀,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天强品,我揣著相機與錄音猾蒂,去河邊找鬼。 笑死偶器,一個胖子當著我的面吹牛搀矫,可吹牛的內(nèi)容都是我干的官觅。 我是一名探鬼主播刑峡,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼洋闽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了突梦?” 一聲冷哼從身側(cè)響起诫舅,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宫患,沒想到半個月后刊懈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年虚汛,在試婚紗的時候發(fā)現(xiàn)自己被綠了匾浪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷哩,死狀恐怖蛋辈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殉疼,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布捌年,位于F島的核電站瓢娜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏礼预。R本人自食惡果不足惜眠砾,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望托酸。 院中可真熱鬧褒颈,春花似錦、人聲如沸励堡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽应结。三九已至刨疼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹅龄,已是汗流浹背揩慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扮休,地道東北人迎卤。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像玷坠,于是被迫代替她去往敵國和親蜗搔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容