1. 程式人生 > IOS開發 >iOS Crash檔案獲取及符號化

iOS Crash檔案獲取及符號化

  1. Crash檔案獲取
  • 大致可以分為兩種方式:遠端獲取和本地獲取;具體可以分為如下四種途徑

1.1. 遠端獲取;已經上傳到iTunes Connect的應用,可以通過iTunes ConnectApp分析檢視App崩潰情況不會有崩潰日誌,如果是TestFlight測試,則可以在iTunes Connect獲取到崩潰日誌

1.2. 遠端獲取;通過Xcode選單Window -> Organizer -> Crashes獲取使用者的崩潰日誌

  • 注意:以上兩種途徑都需要登入開發者賬號,並且需要使用者共享iPhone分析,才能夠獲取到使用者的崩潰日誌
  • 注意:官方提供的崩潰資訊並不是實時的,只能檢視兩天之前的崩潰資訊,需要實時的可以使用第三方工具

1.3. 本地獲取;在手機上設定 -> 隱私 -> 分析與改進 -> 分析資料中,根據應用名稱和日期時間找到你需要的日誌,點選進去後,右上角會有個分享按鈕,分享給Mac

1.4. 把手機連線到Mac,通過Xcode選單Window -> Devices and Simulators -> Devices -> View Device Logs獲取使用者的崩潰日誌

  • 注意某些iOS系統會沒有上面提到的分享按鈕,這時候可以全選複製,再傳送給Mac
    1.1該圖為早期iTunes Connect官網,具體以當前官網為主
  1. Crash檔案符號化
  • 大致也是分為兩種方式:使用Xcode自動符號化和通過手動命令列工具symbolicatecrash
    符號化;這兩種方式原理一樣,都需要dSYM檔案,只不過前者是Xcode自動幫我們完成的
  • 注意:如果你們的應用是通過Xcode上傳iTunes Connect的,並同時上傳了.xcarchive檔案(實際上是一個資料夾,包含.ipa和.dSYM檔案)Xcode會預設幫你勾選該選項,那麼從iTunes Connect獲取到的日誌就已經是符號化過的了

2.1. 使用Xcode自動符號化Crash檔案,Xcode自帶的工具非常好用

  • 如果你用的Mac就是打包的機子,並且得到了發生崩潰的手機,那麼手機連線電腦,通過Xcode選單Window -> Devices and Simulators -> Devices -> View Device Logs
    找到自己的日誌,就是符號化過後的,如果沒有符號化,就稍微等待一會兒,或者右擊點出選單選擇Re-Symbolicate Log
  • 如果只有Mac出包機,沒有手機只有崩潰日誌,那麼同樣可以通過Xcode選單Window -> Devices and Simulators -> Devices -> View Device Logs把崩潰日誌直接拖進去,就是符號化過後的,如果沒有符號化,就稍微等待一會兒,或者右擊點出選單選擇Re-Symbolicate Log
  • 注意:在有些版本的Xcode是拖不進去的,遇到這種情況可以用下面的手動符號化方式
  • 注意:上面的方法不一定要是出包機,本質是隻要你的電腦上有dSYM檔案,Xcode就能自動找到他併為你符號化

2.2. 通過終端命令列工具symbolicatecrash符號化 大概需要如下三個檔案,下面是獲取這些檔案的方法

  • 通過選單Xcode -> Window -> Organizer -> Archiver找到打包的專案,右鍵Show In Finder,找到AppName.xcarchive,右鍵顯示包內容,找到AppName.app.dSYM
  • 在桌面建立一個資料夾tmp,將以上兩個檔案拷貝到tmp資料夾中
  • 開啟終端,用find /Applications/Xcode.app -name symbolicatecrash -type f查詢symbolicatecrash,其中/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash路徑是需要的symbolicatecrash檔案,將symbolicatecrash檔案也拷貝到tmp資料夾中
  • 將需要分析的crash檔案也拷貝到tmp資料夾中,crash檔案的格式可能是.beta.crash.ips
  • 在終端中使用以下命令列,crash檔案格式以.crash為例
# 進入到 tmp 資料夾中
cd ~/Desktop/tmp 

# 分析 crash 檔案,會在 `tmp` 資料夾中生成 crash.log 檔案
./symbolicatecrash ./xxx.crash ./AppName.app.dSYM > crash.log
或./symbolicatecrash ./xxx.crash ./.app.dSYM > crash.log
複製程式碼
  • 如果終端報類似這樣的錯zsh: permission denied: ./symbolicatecrash 說明是symbolicatecrash檔案有問題,可能該檔案不是本機獲取的,或者是之前獲取的、Xcode升級等問題造成的,重新在本機上按上面方法獲取即可
  • 如果終端報類似這樣的錯Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69. 嘗試以下命令後,再重複上面命令,正常情況就可以分析bug了export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
  1. 符號化之前,首先得確保Crash檔案和dSYM這兩個檔案裡面的UUID是一致的,如果不一致,就說明不是本次Crash對應的檔案,就不能進行符號化;檢視dSYM檔案裡面的UUID命令:dwarfdump --uuid AppName.app.dSYM;檢視Crash檔案檔案的UUID就比較簡單了,直接開啟,Crash最上面的就是各種資訊,不同系統版本給的格式可能會有不同,下圖內容為參考
  • XcodeDebug模式下預設關閉生成dSYM檔案,Release模式下預設生成dSYM檔案的, 要生成dSYM檔案需要檢視一下專案的Build Settigns -> Build Options -> Debug information Format屬性;只有該屬性設定為DWARF with dSYM File時,編譯才會生成dSYM檔案
  • 該文是在Xcode 11.2iOS 13.2上寫的教程,不同的系統版本的Xcode和手機系統獲取路徑和符號化方式會有變化

附:我的部落格地址