分析Crash report

分析Crash report

Apple的官方文檔:Understanding and Analyzing iOS Application Crash Reports

iOS設備上,當app崩潰時會創建一個”crash report”文件保存在設備上。Crash report文件記錄了,app崩潰時的信息,通常包含每個線程的調用堆棧。

Symbolication

分析crash report之前,需要把crash report中的內存地址與函數名、行數進行“符號映射”—Symbolication。

必須的文件

  • 上傳AppStore的app二進制包
  • 與二進制包對應的.dSYM文件

每次上傳AppStore時的app二進制包也.dSYM文件都一定要保存好。

這兩個文件必須是嚴格一一對應的,否則crash report不能完全的符號映射。即使代碼沒有任何修改,重新編譯一次生成的.dSYM文件,與上次編譯的app二進制包也是不能對應的。

使用XCode的”Archive”命令可以非常便捷的保存相互對應的app包與.dSYM文件,當完成Product->Archive命令後,可以在XCode Organizer的Archived頁面裏查看所有Archive過的應用程序。(app上架時,非常推薦用這種方式去提交。)

如果存在互相對應的app二進制包與.dSYM文件,那麼XCode會對這個app產生的crash report自動進行符號映射。

網上那些使用symbolicatecrash工具進行映射的操作都是多此一舉。

操作步驟

  1. 準備好app包、.dSYM、crash report文件
  2. 把crash report導入到XCode Organizer:打開XCode Organizer –> Devices選項 –> 選擇左側LIBRARY分組下的Devices Logs –> 點擊Import按鈕選擇.crash文件。
  3. XCode會自動Symbolicate crash report文件,並顯示結果。

如果你是直接把設置連接到Mac,並從XCode Organizer窗口裏直接獲取crash report的,那麼能夠自動進行Symbolication,非常方便。不過多數情況下,我們是分析用戶的crash report。

符號沒有映射成功?

我嚴格的按照以上所有步驟操作,但是Crash report中與我的app相關的內容依舊顯示內存地址並沒有映射爲可讀的代碼符號。我花了幾個小時的時間搜索各種相關的資料,解決方案,嘗試了幾乎所有方法還是沒能成功解出符號。

最後在github上找到這樣的一個回覆:

If you goto Xcode->Organizer click on archives then right-click any archive and select show in finder. Back up to the folder called Xcode that contains the archive. Run terminal and cd to this folder, you can do this easily by typing ‘cd ’ then dragging the folder to the terminal. Now type ‘mdimport .’ and enter. This will take a minute to finish. If you go back to Organizer and find your crash file then press Re-Symbolicate it should now give you method names and line numbers.

按照他的方法操作了一次,居然就成功了。找到Archive操作的.app與.dSYM所在目錄,一般是/Users/用戶名/Library/Developer/Xcode/Archives(可以在Organizer Archives中,右擊Archive包進入),命令行中cd到/Users/用戶名/Library/Developer/Xcode/,輸入命令:

mdimport .

意爲,把Xcode目錄加入到spotlight索引,這可能需要一些時間,等一等。

也可以只導入你需要的.app與.dSYM文件,這樣比較快速。

原來符號不能正確映射的原因是:

我的.app與.dSYM文件沒有被spotlight索引到,導致符號映射失敗,Apple的文檔中提到:

If you use the “Build and Archive” command then they will be placed in a suitable location automatically. Otherwise any location searchable by Spotlight (such as your home directory) is fine.

dwarfdump工具

直接查詢崩潰的內存地址,定義崩潰代碼的文件與行數。

需要.app與.dSYM文件,不做詳細介紹。

示例:

dwarfdump –lookup 0x000036d2 –arch armv6 MyApp.app.dSYM

我的結果

經過反覆測試,發現崩潰原因是,cocos2d-x引擎的CCBReader擴展中文件讀取時,其中有一個操作沒有考慮ARM下內存對齊,崩潰並Exception Codes: EXC_ARM_DA_ALIGN。Github上找到新版源碼,問題就修復了。

轉自:http://go3k.github.io/blog/2013/03/11/ios-crashreport/


發佈了28 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章