符號(hào)化iOS崩潰報(bào)告

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

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

開始

你已經(jīng)遞交你的應(yīng)用程序的崩潰報(bào)告,但是?;厮莅穗y懂的內(nèi)存地址。開發(fā)者該怎么辦?簡(jiǎn)而言之,你需要調(diào)試符號(hào)來應(yīng)用于堆棧追蹤,從而使它人類可讀,這個(gè)過程我們稱作符號(hào)化。

在開始之前,我們依照使用Crasher,它提供了一個(gè)簡(jiǎn)單崩潰報(bào)告,讓你破譯。

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

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

0.導(dǎo)致崩潰的應(yīng)用程序構(gòu)建的.app文件。這個(gè)包包含了應(yīng)用二進(jìn)制文件,以及可能包含測(cè)試符號(hào)。(如果你有一個(gè).ipa文件,你可以把它當(dāng)做一個(gè).zip文件,通過解壓這個(gè)文件把它提取出來)

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

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

但是等等,什么是調(diào)試符號(hào)?

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

檢查崩潰

如果通過Xcode的Organizer從設(shè)備中提交崩潰報(bào)告,你的崩潰報(bào)告可能將會(huì)對(duì)UIKit和其他iOS框架自動(dòng)符號(hào)化。如果Xcode知道你的創(chuàng)建,他將自動(dòng)符號(hào)化你的崩潰。

如果不是這種情況,你需要自己符號(hào)化。

使用"Symbolicatecrash"工具來符號(hào)化

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

對(duì) Xcode 6,你可以在下面目錄里找到這個(gè)工具:

/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

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

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

把你的.crash文件.app文件和.dSYM文件放在同一個(gè)目錄下然后運(yùn)行:

symbolicatecrash -v ScaryCrash.crash > Symbolicated.crash

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

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

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

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

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

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

驗(yàn)證符號(hào)化

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

dwarfdump –uuid Crasher.app/Crasher

結(jié)果:

1.png

在dSYM文件中:

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

結(jié)果:

2.png

和你的崩潰報(bào)告中的UUID進(jìn)行比較:

3.png

從symbolicatecrash工具冗長(zhǎng)的日志里,同樣列出它找出的UUID。

排查 "Symbolicatecrash" 工具

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

4.png

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

5.png

或者有一個(gè)無效的.dSYM:

6.png

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

7.png

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

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

使用命令行工具鏈

我們可以深入 和使用開發(fā)者命令行工具鏈來一行行的符號(hào)化棧追蹤的內(nèi)存地址。如果你在過去使用這個(gè)方法中遇到問題,那可能是因?yàn)樵谧罱鼛啄?crash文件根式改變了。

首先,讓我們?cè)倏纯次覀儽罎?bào)考中的棧追蹤:

8.png

最左邊的十六進(jìn)制值,0x000aeef6,是棧地址。第二個(gè)十六進(jìn)制值,0xa8000,是應(yīng)用程序的加載地址。以加號(hào)為開始的數(shù)字,28406,是棧地址和加載地址的差值。 0x00aeef6 = 0xa8000 + 0x6EF6
。你將會(huì)發(fā)現(xiàn)在我們的崩潰報(bào)告底部的“Binary Images”,它是動(dòng)態(tài)庫內(nèi)存地址范圍列表。我們的二進(jìn)制文件的起始地址在堆棧跟蹤加載地址相匹配。

9.png

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

file Crasher.app/Crasher

結(jié)果:

10.png

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

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

結(jié)果:

11.png

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

更多閱讀

更多全面的文檔,請(qǐng)查看:
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)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

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