Understanding and Analyzing Application Crash Reports (一)

原文是? 2017-02-21 Technical Note TN2151

(時間有限,翻譯粗糙,見諒,日后再整理)

? 當(dāng)應(yīng)用崩潰時,崩潰日志就被創(chuàng)建起來,這對查找崩潰原因非常有幫助,這個文檔包含一系列基本的信息關(guān)于怎樣符號化,理解并解釋崩潰報告。

簡介:

當(dāng)一個應(yīng)用崩潰時,一封崩潰報告就會被設(shè)備創(chuàng)建和保留。在應(yīng)用結(jié)束前崩潰報告描述了一些情況,大多數(shù)都包含一份完整的可執(zhí)行線程,這通常對調(diào)試程序非常有用,你應(yīng)該查看這些崩潰報告去理解你的應(yīng)用有哪些崩潰并且試著修復(fù)這些問題。

可回溯的崩潰報告必須在分析前被符號化,符號用可讀性的方法名和行數(shù)替代了內(nèi)存地址,如果你在Xcode的Devices窗口得到了崩潰日志,他們會在幾秒后自動的為你自動的進(jìn)行符號化,如果沒有,那你就必須自己通過Xcode的Devices窗口符號化它們,具體細(xì)節(jié)參考 ?Symbolicating Crash Reports 這篇文章。

低內(nèi)存的報告和其他崩潰報告不一樣,在這種報告中沒有回溯信息。當(dāng)?shù)蛢?nèi)存崩潰發(fā)生時,你應(yīng)該檢查你的內(nèi)存使用模式,和當(dāng)?shù)蛢?nèi)存警告出現(xiàn)時你的處理方式。這篇文章指出了特別對你有用的一些內(nèi)存管理指南。

獲取崩潰和低內(nèi)存報告

Debugging Deployed iOS Apps ?討論了怎樣從iOS設(shè)備直接中檢索崩潰和低內(nèi)存報告

App Distribution Guide 中的 Analyzing Crash Reports ?討論了怎樣從在App Store下載你的應(yīng)用的TestFlight測試和用戶中查看崩潰報告的總數(shù);

符號化崩潰報告:

符號化是解決回溯地址到源代碼方法或方法名的過程,比如符號。如果沒有符號化崩潰報告就很難決定崩潰發(fā)生的地方。

注意:低內(nèi)存報告不需要被符號化。

注意:崩潰報告在macOS系統(tǒng)產(chǎn)生時通常會被符號化或者部符號化,這一章節(jié)主要講iOS,watchOS,tvOS的崩潰報告符號化,但是大體過程和macOS的一樣。

圖1: 崩潰報告和符號化過程的概述


1 當(dāng)編譯器把你的源代碼翻譯成機器碼,它還生成調(diào)試符號,將編譯后的二進(jìn)制指令中的每個機器指令映射到源代碼中的代碼行。根據(jù)調(diào)試信息格式(DEBUG_INFORMATION_FORMAT)編譯設(shè)置,這些調(diào)試符號儲存在二進(jìn)制或配套調(diào)試符號文件中。默認(rèn)情況下,調(diào)試版本的應(yīng)用程序 儲存 調(diào)試符號在編譯的二進(jìn)制文件中,而發(fā)布版本的應(yīng)用程序 儲存 調(diào)試符號在配置dsym文件中,從而減少二進(jìn)制文件的大小。

調(diào)試符號文件和應(yīng)用二進(jìn)制文件通過生成的UUID捆綁在一份編譯文件。你建立并生成每個應(yīng)用程序的都會產(chǎn)生一個唯一標(biāo)識的UUID。即使一個功能相同的可執(zhí)行文件從相同的源代碼重構(gòu),并具有相同的編譯器設(shè)置,但是會有不同的編譯UUID。后續(xù)版本的調(diào)試符號文件,甚至來自同一個源文件,不會與其他版本的二進(jìn)制文件互用。

2 當(dāng)你在發(fā)布應(yīng)用程序而存檔時,Xcode會隨著.dsym文件存放在主頁文件夾時存儲應(yīng)用程序二進(jìn)制文件。你可以在“Archived”部分下的“Xcode Organizer”中找到所有的存檔應(yīng)用。更多關(guān)于創(chuàng)建存檔的資料,請參見App Distribution Guide.

注意:為了符號化測試員,應(yīng)用審查人員和客戶的崩潰報告,你必須保留每個你發(fā)布的應(yīng)用程序的存檔。

3 如果你通過App Store發(fā)布的應(yīng)用程序,或使用TestFlight進(jìn)行測試,你可以在上傳存檔到iTunes Connect時選擇包含dSYM文件。在提交會話欄中選擇 “Include app symbols for your application…”。上傳你的dSYM文件對選擇了分享診斷數(shù)據(jù)的TestFlight用戶中搜集的崩潰報告來說是必要的,更多關(guān)于崩潰報告服務(wù)的信息,參考 App Distribution Guide.

注意:即使你在上傳你的歸檔到iTunesConnect ,在App Review中得到的崩潰報告不會被符號化。你需要通過Xcode符號化任何從AppReview中接受的崩潰報告,參見Symbolicating Crash Reports With Xcode.

4 當(dāng)你的應(yīng)用程序崩潰,一個unsymbolicated崩潰報告創(chuàng)建并存儲在設(shè)備上。

5 用戶能夠按照Debugging Deployed iOS Apps.中的步驟直接從他們的設(shè)備中搜索崩潰報告,如果你的應(yīng)用通過AdHoc或者企業(yè)版發(fā)布,這是唯一你能從你的用戶獲得崩潰報告的路徑。

6 從設(shè)備中獲得的崩潰報告沒有符號化,需要通過Xcode符號化,Xcode使用二進(jìn)制文件相關(guān)聯(lián)的dSYM文件替代在源代碼中的原位置的每個回溯中的地址。結(jié)果就是符號化的崩潰報告。

7 如果用戶選擇了給蘋果公司分享診斷數(shù)據(jù),或者用戶通過TestFlight安裝了測試版本,崩潰報告就會上傳到App Store。

8 App Store 符號化這些崩潰報告并且將相識的崩潰報告分組,這些相似的崩潰報告歸納起來叫做崩潰點(Crash Point)。

9 可以通過 Xcode的Crashes organizer符號化崩潰報告。

Bitcode

Bitcode 是編譯程序這種的中間表示。但你使用bitcode enabled 來歸檔一個應(yīng)用時,編譯生成的二進(jìn)制文件包含bitcode而不是機器碼。一旦二進(jìn)制文件被上傳到App Store,bitcode就被編譯成機器碼。利用未來編譯器的改進(jìn),App Store可能以后會再次編譯bitcode,這對你的部分不會有影響。

圖2: 概述bitcode編譯過程


因為你的二進(jìn)制文件在App Store中進(jìn)行最后的編譯,你的mac將不會包含從應(yīng)用審查或者從他們設(shè)備發(fā)送崩潰報告的用戶中需要符號化崩潰報告的調(diào)試符號文件,雖然dSYM文件在你歸檔應(yīng)用的時候產(chǎn)生,但是只能用來bitcode二進(jìn)制文件,并且不能符號化崩潰報告,App Store從Xcode或者iTunes Connect網(wǎng)站得到bitcode編譯文件供你下載。為了那些從App Review或者用戶從他們的設(shè)備發(fā)送的崩潰報告中符號化崩潰報告,你必須下載這些dSYM文件。通過崩潰報告服務(wù)的崩潰報告將會被自動的符號化。

注意:通過App Store的二進(jìn)制編譯文件將會和最初提交的二進(jìn)制文件有不通的UUID。

通過Xcode下載dSYM文件:

1 在 Archives organizer 中,選擇你最初提交到App Store的歸檔。

2 點擊 Download dSYMs 按鈕。

Xcode下載dSYM 文件后嵌入到選擇的歸檔文件中。

通過 iTunes Connect 網(wǎng)址下載dSYMs文件

1 打開 App Details 頁面。

2 點擊Activity。

3 從所有編譯文件中,選擇一個版本。

4 點擊 Download dSYM 鏈接。

確定一份崩潰報告是否被符號化

一份崩潰報告可能沒有被符號化,完全符號化或者部分符號化。沒有被符號化的崩潰報告不會在回溯中包含方法或者函數(shù)名。在裝載的二進(jìn)制圖像你有可執(zhí)行代碼的十六位進(jìn)制地址。在一份全部符號化的崩潰報告,在回溯的每行代碼的十六進(jìn)制地址都被相應(yīng)的符號替代。在部分被符號化的報告中,總有一部分回溯中的地址被相應(yīng)的符號替代。

很顯然,你應(yīng)該嘗試著完全符號化所有你收到的崩潰報告,這將為崩潰提供最清晰的說明。部分的符號化崩潰報告依賴崩潰的類型和成功符號化的部分回溯可能包含足夠的信息去理解崩潰。沒有被符號化的崩潰報告幾乎沒有用。

圖 3 ?:基于一份回溯的各種級別的符號化。

使用Xcode來符號化崩潰報告

Xcode會自動嘗試他所遇到的所有崩潰報告。為了符號化你所要做的只是在 Xcode Organizer中添加崩潰報告。

1 把你的iOS設(shè)備連接上你的Mac。

2 在“window”目錄選擇“devices”。

3 在“devices”部分的左欄中,選擇一個設(shè)備。

4 在右面板的“Device information”部分點擊“view device logs”按鈕

5 拖動你的崩潰報告到展示面板的左欄。

6 Xcode會自動的符號化崩潰報告并顯示結(jié)果

為了能符號化崩潰報告,Xcode需要找到如下:

1 崩潰應(yīng)用的二進(jìn)制文件和dSYM文件

2 應(yīng)用鏈接的所有自定義框架的二進(jìn)制和dSYM文件。對于應(yīng)用的源碼編譯的框架,他們的dSYM文件伴隨著應(yīng)用的dSYM文件被復(fù)制到歸檔中。對于用第三方編譯的框架,你必須向作者索要dSYM文件。

3當(dāng)應(yīng)用崩潰時運行的操作系統(tǒng)的符號文件。這些符號文件為框架包含了有特定操作系統(tǒng)發(fā)布版本的調(diào)試信息,(比如iOS9.3.3)。

操作系統(tǒng)符號文件是有特定架構(gòu)的,64bit設(shè)備的操作系統(tǒng)不會包含arm7符號文件。Xcode會自動復(fù)制連接你Mac的設(shè)備的操作系統(tǒng)符號文件。

如果 如上文件有遺失。Xcode就不會或者只會部分的符號化崩潰報告。

最后編輯于
?著作權(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)容