MonoTouch製Appが生成したクラッシュログのシンボルを解決する

Appがクラッシュした時に生成されるクラッシュログ。この中身は関数アドレスが書いてあるだけでとても読み取りにくい。本家Appならばオーガナイザでアドレスのシンボル解決を自動的にやってくれるのだが、MonoTouch製Appの場合は手動で行う必要がある。

下準備

シンボル解決コマンドsymbolicatorに対する環境変数が必要なのでホームディレクトリの.bash_profileに以下を追加する

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

そしてコマンドへのパスがとても長い。
Xcode v4.5.2の時点でパスは/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resourcesになる。いちいちこれを入力するのは面倒なので.bash_profileに以下を追加した。

export PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources:$PATH

Xcode v5では/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrashになる。

dSYM情報の準備

symbolicatorはdSYM情報を必要とする。本家Appの場合は~/Library/Developer/Xcode... なディレクトリに自動生成されている。
MonoTouchの場合はビルド出力先に{プロジェクト名}.app.dSYMという名前のフォルダが生成されている。しかし実はこのままでは必要なファイルが足りずシンボル解決できない。これは{プロジェクト名}.appフォルダ以下のファイルをコピーするだけで解決する。

cd {ビルド先}
cp -nR {プロジェクト名}.app/* {プロジェクト名}.app.dSYM

※ビルドするとdSYMフォルダは削除されるのでその度この作業が必要になる。

クラッシュログの取得

オーガナイザでエクスポートしたり、iTunesで同期をしてクラッシュログファイルをMacの方にコピーする。

symbolicatorの実行

symbolicatorを実行する

symbolicator クラッシュログファイル名 {プロジェクト名}.app.dSYM

これでようやくシンボルが解決される。

追記 2014/03/11 14:10

Xcode5でのパスを追記