Symbolicate App Store Review 提供的 crash log

Charlie Hung
KKday Tech Blog
Published in
6 min readJun 5, 2019

要透過 App Store 發佈外部測試版本或是正式上架到 App Store 前,都會有必經的 review 過程。過程中有時候是不小心有 bug,有時候是因為測試環境和外部套件的關係,被 reviewer 回報 in house 時沒有遇到過的 crash issue。

而 App Store Connect 提供 crash log 的方式是以 .txt 檔案的格式,內容是未符號化的 stacktrace 如下。

而問題就在於這些位址組成的資訊並沒辦法幫助我們了解問題是出在哪個 function 或是哪個流程下,所以我們要將內容符號化成可以理解的內容。

先簡單敘述一下我們的情境,根據建置環境,可能會有不同的狀況:

  • 因為我們使用的第三方套件的關係,目前並沒有使用 bitcode 的機制,因此和(可能)大部分使用 bitcode 的 app 不同,在 App Store Connect 上沒辦法如圖下載 .dSYM 檔案。
較早的版本有使用 bitcode,因此可以從 App Store Connect 下載
  • 因為我們使用 Jenkins 自動化建置,所以不會出現在 Xcode 的 Archives 中,也沒辦法從中 Download Debug Symbols

因此,我們在建置流程中自動備份了各個版本的 .dSYM 檔案。

特別要注意的是,因為我們的 .dSYM 檔案其實是個套件,當中除了主要 app 的以外,其實還包含了很多其他的 framework 的 .dSYM 檔。所以我們要先找到最重要的那個 .dSYM 檔案,這裡以 kkday.app.dSYM 為例。

顯示原始 .dSYM 檔的套件內容
找到主要 app 的 .dSYM 檔案

準備好下列檔案,我們可以開始進入正題:

  1. Crash log,以 crashlog-03924177–8051–4536-B6D3–0CE1B6D48907.txt 這個檔案為例。
  2. .dSYM 檔案,以 kkday.app.dSYM 為例。

首先開啟終端機,我們要使用的是 Xcode 內建的工具 symbolicatecrash,因為路徑並不在 /usr/bin 或其他常包含在 $PATH 參數路徑中,所以我們可以選擇直接使用完整路徑或是以 alias 的方式執行。

找到 symbolicatecrash 路徑

find /Applications/Xcode.app -name symbolicatecrash -type f

通常是在

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

設定 alias

alias symbolicatecrash='/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash'

重頭戲,執行命令轉換 crash log。-o 後接的是輸出的檔案路徑,這裡用 crashlog.txt 做例子。

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash crashlog-03924177-8051-4536-B6D3-0CE1B6D48907.txt -d kkday.app.dSYM -o crashlog.txt

如果遇到下面的錯誤訊息

Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash

那麼需要執行下面的指令後再執行一次

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

最後得到的 crashlog.txt 內容就會是容易找到問題點和 call stack 的形式了。

--

--