はじめに
Appleのアプリ審査でクラッシュが報告されたときに、クラッシュログを添付してもらえます。しかし、どのメソッドでクラッシュしているかそのログだけ見ていても、よく分かりません。
シンボリケーションという手続きを踏むと、どのメソッド・行で問題が起きたか知ることができます。
この手続きを普段あまりしない人に向けて、コピペで済むように、その手順を示します。
環境
Xcode 8.3.3
1. Resolution Centerのcrashlog-(長い識別子).txtをDLする
この.txtのリンクを右クリックし、「リンク先を保存する」を選択してダウンロードします。操作しやすいように、ファイル名をcrashlog.crash
に変更しておきます。
そして、今回の作業用に新規作成したフォルダ(例えば、WorkingFolder
)をデスクトップ上に作ります。その中に上のcrashファイルを格納します。
2. dSYMsを取り出す
XcodeのOrganizer(上のメニューの右端にあるWindowの中から選択できる)から、クラッシュログが報告されたアーカイブを選択し、右クリックで"Show in Finder"を選ぶと、(特定のファイル名).xcarchive
が表示されます。
このファイルを右クリックして「パッケージの内容を表示」を選択すると、dSYMsフォルダがあるので、このdSYMsフォルダを#1のフォルダ(WorkingFolder
)の中にコピーします。
3. ターミナルからシンボリケートを実行する
Terminal.appを起動します。取っつきにくいですが、下のコマンドをコピペしていければ大丈夫です。
まず、cd
と打ってから、スペースキーを押して、macOSのFinder上にある#1のフォルダ(WorkingFolder
)をドラッグドロップします。パスが入ります。
こんな形になっているはずです。
cd /Users/(ユーザ名)/Desktop/WorkingFolder
実行したいので、リターンキーを押します。
カレントになっているディレクトリが変わったので $の左側の表示が変わったと思います。成功です。
同様に、次のコマンドをコピペして、リターンキーを押して実行します。
export DEVELOPER_DIR= `xcode-select -p`
反応がないように見えますが、内部で効いているので大丈夫です。
最後に、次を実行します。長いので、スクロールして全部コピペします。
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash ./crashlog.crash ./dSYM >> symbolicate.crash
最後にリターンキーを押して実行します。
4. シンボリートされたクラッシュログが作成される
フォルダにsymbolicate.crashが作成されます。直後は0MBの表示になっていて不安になるかもしれませんが、少し待つと、symbolicate.crashがちゃんと完成します。
シンボリケーションの作業はこれで完了です。
うまくいかない場合は、まずファイル名やパスの指定が間違っていないか確認してみましょう。
見るべき場所
クラッシュログは情報が豊富ですが、クラッシュした箇所を特定したい場合、まず注目するのはCrashedになっているThreadです。
直近のメソッドが最上位に来ているので、そのメソッドに注目します。
メソッドの右には(ソースファイル名:行数)が併記されているので、どの行で落ちたのかが読み取れます。
Exception Typeの種類、Crashedになっているスタックに並んだ見覚えのないメソッドについては、ネットで検索して意味を読み取るのが早いです。内部的に実行されているメソッドは、書いた覚えのないメソッドとして別名で登場するのでクラッシュログだけで読解するのは、類似のケースを経験をしていないと困難です。
感想
審査提出はプロジェクトの終盤の、忙しいときが多いと思います。dSYMsを把握しているAppleさん側でシンボリケートまで済ませてログを送ってくれたらもっと楽なのにな・・・という横着な気持ちになりました。
ただ、暗号を解読する手順のようでワクワクする面もありますね。