2011年2月10日木曜日

アプリがクラッシュする場合のcrashファイルの見方

iPhoneアプリのテストって大変ですねw アドホックビルドしたアプリのテストをお願いしていたところ、iPhone3G,3GS では問題ないのに、iPhone4だけ起動直後に落ちるという報告をいただいていた。ちょっと調べてみたところ、iPhoneでアプリが落ちた場合、.crashというファイルが作成されて、母艦との同期時に保存されるらしい。そのファイルを送ってもらって、調べてみたところ、うまく不具合が解消できたようなのでメモ。

まず、ビルド時に一緒に生成される、.dSYMファイルが必須。ビルドしたものを配布するときは、そのビルドしたファイルと一緒に、バックアップを残しておくようにする。

次に、落ちた報告があった場合、次の場所に.crashファイルが出来ているので、送ってもらう。

Mac OS X : ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
Windows XP: C:\Documents and Settings\<USERNAME>\Application Data\Apple computer\Logs\CrashReporter/<DEVICE_NAME>
Windows Vista: C:\Users\<USERNAME>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/<DEVICE_NAME>

次に、symbolicatecrash というツールを使うけど、ファイル階層が深いので /usr/local/bin あたりにコピーする。

$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/
$ symbolicatecrash -h

そして、.crash ファイルと、.dSYM ファイルを同じディレクトリにおいて(アプリはなくてもいいような?)実行する。

$ symbolicatecrash 送ってもらった.crash 保存しておいた.app.dSYM > 標準出力されるので適当な名前のファイル

最後に保存したログをテキストエディタなどで開いてチェック。今回のアプリではスレッドも多用してるので、たくさんログが出て来るが、Thread 0 Crashed:などと書いてある、どこのスレッドでクラッシュしているか、を最初に探す。もちろんこの場合はスレッド0を見る。
そうすると、ログがスタックされている(要は実行されているものが積み上がっている)ので、なるべく上(左の番号が若い)にある自分のアプリ名を探す、と、呼び出しているメソッドとその行番号がわかるので、その辺りが怪しいとわかる。

今回の自分のアプリでは、NSAutoreleasePool 辺りが怪しかったので、コメントにしたらクラッシュしなくなった。

元々ごにょごにょコードが書いてあったところを、少しづつメソッド化して切り出していった後の名残だったので、とりあえず問題ないかなと。

参考にさせてもらったのは以下のサイト

あとは、昨日書いたアナライズも役に立ってると思う。

0 件のコメント:

コメントを投稿