iPhone で Crash Reports を利用したバグの発見方法
この記事は「写真と地図で見る京都 秋」iPhoneアプリケーションの開発に関するものです。
Crash Reports とは
iPhoneアプリ開発者は、開発をおこなったアプリをユーザーが使用している時にクラッシュした場合は、その情報を iTunes connect からDLして観覧する事が可能です。
Crash Reports の入手方法
iTunes connect に接続し、以下の画像の赤枠のボタンを順番にクリックしていきます。 "Manage Your Applications" -> "App Details" -> "View Crash Reports"
ここまで来るとOSのバージョンごとにレポートを見る事ができます。どうやら OS3.1 で 2 つのバグが出ているようです。今回は 2 つ目の "PMS2: ms::GLKeyedSprite::setRenderKey + 192 38% of submitted crashes" のバグ修正を行っていきますので、その右の DOWNLOAD ボタンをクリックします。
バグ修正
レポートにはいろいろな情報が書かれていますが、今回は関数呼び出しの履歴の箇所を見ると、一発で原因がわかりました。
Thread 0 Crashed:
0 libSystem.B.dylib 0x32a229ac __kill + 8
1 libSystem.B.dylib 0x32a2299c kill
2 libSystem.B.dylib 0x32a2298e raise
3 libSystem.B.dylib 0x32a3763a abort
4 libSystem.B.dylib 0x32a24f30 __assert_rtn
5 PMS2 0x00008d68 ms::GLKeyedSprite::setRenderKey(int const*, unsigned int) + 192
6 PMS2 0x00008bec ms::GLKeyedSprite::setRenderKeyWithCString(char const*) + 228
7 PMS2 0x000174c4 Time::update(unsigned int) + 180
8 PMS2 0x000071bc Scene::update(unsigned int) + 388
9 PMS2 0x00009a94 ms::GLScene::onUpdate() + 36
10 UIKit 0x30d5d574 -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
自前で実装しているクラス関数 "ms::GLKeyedSprite::setRenderKey()" 中の "assert()" に引っかかりプロセスが殺されています。その前の関数呼び出しが "Time::update()" からなので、アプリ画面の上部に表示している時計を描画している時に問題があるようです。
"ms::GLKeyedSprite::setRenderKey()" 内の "assert()" を if 文に変更し、引数に問題があってもとりあえず動作するようにします。本来ならそもそも低レベル関数を使用している "Time::update()" あたりのバグを修正することろですが、できるだけユーザーの端末でクラッシュする確率を減らすため、今回は "assert()" を削るという修正になりました。
それでは、よりよいアプリ開発を!!