【iOS】クラッシュログをシンボリケートする方法


前書き

iOSアプリのApp Store公開申請にて、Appleの担当者によるレビューの際にアプリがクラッシュしてしまうと、リジェクトメッセージと共にクラッシュログが送られてきます。
クラッシュログはログ内の関数名が16進数のメモリアドレスで記載されているので、このままではどこでクラッシュしたのかわかりませんが、シンボリケートすることでメモリアドレスが関数名に変換されるのでクラッシュの調査がしやすくなります。

筆者もリジェクトをくらい、クラッシュログをもらったのでシンボリケートしようと思ったのですが、Appleの公式リファレンスやネットの記事を参考に、同じような手順でシンボリケートしてみたがなかなか上手くできず、小一時間苦戦してやっとできたので、同じように苦戦している方に向けて記事を書きました。

最初にやること

任意の場所に「CrashLog」フォルダを作成しておきましょう。
このフォルダに必要なものを詰め込んでいきます。

① アプリのクラッシュログを保存

App Store Connectのリジェクトメッセージの下に添付されていると思うので、
ファイル名と拡張子を CrashLog.crash にして「CrashLog」フォルダに保存します。

※ 筆者のように複数送られてくる場合もあるので、その場合はどれでも良いのでどれか1つを保存しましょう

② dSYMsフォルダをコピー

Xcodeを開いて、WindowからOrganizerを選択します。

アーカイブ一覧が表示されるので、クラッシュしたバージョンのアプリを選択して、「Download Debug Symbols」ボタンを押下します。
「Download Debug Symbols」を押下しておかないと、シンボリケートする際にNo symbolic information foundと表示されて、シンボリケートに失敗しました。(これで小一時間苦戦しました)

ダウンロードが終わったら、アーカイブを右クリックして、Show in Finderを選択

アーカイブファイルがFinderに表示されるので、右クリックして「パッケージの内容を表示」を選択。
「dSYMs」というフォルダがあるので「CrashLog」フォルダにコピーします。

③ クラッシュログをシンボリケートする

シンボリケートする際に、Xcodeに付属している symbolicatecrashという実行ファイルを使用します。
Xcode11の場合は下記のパスにあります

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
  1. symbolicatecrashファイルを「CrashLog」フォルダにコピーします

CrashLogフォルダは下記のようになります。

CrashLog
|-- CrashLog.crash
|-- dSYMs
|-- symbolicatecrash


2. ターミナルを開いて「CrashLog」フォルダまで移動します。

$ cd [CrashLogフォルダまでのパス]


3. 下記のコマンドを実行してパスを通します。
これをやらないとシンボリケートの際にError: "DEVELOPER_DIR" is not defined atとエラーになります。

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


4. 下記のコマンドを実行してシンボリケートする

$ ./symbolicatecrash CrashLog.crash dSYMs/ > symbolicateCrashLog.crash

結果

symbolicateCrashLog.crash ファイルにシンボリケートされたログ内容が出力されます。

・シンボリケート前

・シンボリケート後

ファイル名・関数名・行数まで確認できるようになりました。