##symbolicateとは
MacやiOSのクラッシュログは取得した状態ではアプリ固有のシンボル名は記載されません。
そこで、クラッシュログを読みやすくするためにアプリ固有のシンボル名をクラッシュログに付加する必要があるのですが、この処理のことをsymbolicateと呼びます。
##symbolicatecrash
symbolicatecrashというXcodeに付いているスクリプト(perlで書かれています)を使ってsymbolicateすることができます。symbolicateには以下の3つのファイルが必要になります。
・クラッシュログそのものである.crashファイル
・アプリの本体(.app)
・シンボル情報(.dSYM)
symbolicatecrashスクリプトの第一引数はクラッシュログのパスです。しかし、それ以外の引数はオプションです。.appと.app.dSYMは必要であるにもかかわらず、引数に指定する必要がありません。
ではどうやって必要な.appとdSYMを探しているのでしょうか。
##.appと.dSYM
symbolicatecrashスクリプトは.appと.app.dSYMの検索にSpotlightの機能を使用しています。Spotlightのコマンドラインツールであるmdfindとmdlsを使って必要なファイルを探します。
検索の手がかりとするのはXcodeが付加しているメタ情報とクラッシュログに記述されたアプリイメージのIDです。.app.dSYMにはcom_apple_xcode_dsym_uuidsとcom_apple_xcode_dsym_pathsというメタ情報が付加されています。com_apple_xcode_dsym_uuidsにはシンボルを格納している対象のアプリイメージのIDが書き込まれており、mdfindを使うことでクラッシュログの対象となるシンボルを格納した.dSYMを探し出します。
そしてmdlsを使い、.dSYMからcom_apple_xcode_dsym_pathsに含まれるアプリ名を抽出します。抽出したアプリ名を使いmdfindで対象候補のファイルを抽出し、さらに候補ファイルのcom_apple_xcode_dsym_uuidsメタ情報とマッチングすることで正しいアプリイメージを見つけ出します。
##トラブルシューティング
symbolicatecrashはSpotlightの機能とメタ情報をフルに活かして素早く簡潔に正しい.appと.dSYMを探し出しています。しかし、Spotlightに依存しているため対象のファイルがSpotlightのインデックスに載っていない場合やメタ情報が失われてしまった場合などには正しく動作しなくなってしまうという問題があります。
symbolicatecrashがうまく動作しない場合、対象のファイルをmdfindとmdlsを使って検索できることやメタ情報が存在することを確認することで問題が見つかるかもしれません。
Spotlightによる検索が原因でsymbolicatecrashが動作しない場合、mdimportでインデックスを作成するかxattrによるメタ情報の手動での付与で問題が解決する可能性があります。