クラッシュ分析ツールBugSenseでアプリのバグの原因を突き止める。

アプリはブラウザサービスと違って、処理のロジックがクライアントに寄っているので、動作に不具合があってもサーバからは検知できません。またアプリの場合は、環境依存による問題も考慮する必要があります。
最近はJavaScriptをフルに使ったブラウザサービスも多いので、一概には言えないですが、アプリの不具合の修正はブラウザサービスより難しいです。
そこで、アプリにクラッシュレポートツールを導入して、問題があった時にサーバにログを送信するなどして原因の特定に役立てます。クラッシュレポートツールの有名どころは、CrashlyticsCrittercism、そしてBusSenseです。

BugSenseはアプリのクラッシュ分析ツール

BugSenseはアプリのクラッシュレポートを取得することができるツールです。
スクリーンショット 2014-05-04 1.59.47

CrashlyticsはTwitterに買収されましたが、BugSenseも昨年にSplunkに買収されています。

登録とアプリ情報の追加

登録は、名前、メールアドレス、パスワードの他に、住所や会社名も必要です。
スクリーンショット 2014-05-04 2.00.07
登録が完了すると、さっそくアプリの情報の登録を求められます。
スクリーンショット 2014-05-04 2.01.38
ここで、アプリ名と共に、iOSかAndroidかとか、開発中かどうかを登録します。
登録が完了すると、ダッシュボードが解放されます。
スクリーンショット 2014-05-04 2.03.51
まずは空っぽの画面で、SDKを導入せよ、という指示があります。

SDKの導入は1行のみ

SDKの導入方法として、1行のソースコードが表示されます。
スクリーンショット 2014-05-04 2.07.28
ライブラリをプロジェクトに導入した上で、このソースコードをコピペすれば完了です。
iOSのドキュメントAndroidのドキュメントにSDKのパッケージへのリンクがあるので、これをまずはプロジェクトに導入する必要があります。
今回はiOSに導入してみます。iOSの場合は、依存としてSystemConfiguration.frameworkとlibz.dylibも必要です。
ソースコードの記述は、アプリの起動時で問題ないと思います。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [BugSenseController sharedControllerWithBugSenseAPIKey:@"e9105094"];
    // ...(略)...
    return YES;
}

これで起動してみると、BugSenseにデータを送信している痕跡が見られます。

BugSense --> Posting analytics data...
BugSense --> Server responded with status code: 200

導入完了です!

わざとクラッシュさせてみる

Objective-Cで、テキトーにクラッシュするコードを埋め込んでみます。たとえば次のように、存在しないセレクタを呼びだそうします。

[self performSelector:@selector(bug)];

これで起動するとクラッシュします。

-[AppDelegate bug]: unrecognized selector sent to instance 0xb974560
BugSense --> Posting analytics data...
BugSense --> Symbols are being retained...
BugSense --> Symbols have been retained.
Not retaining log messages
BugSense --> Additional crash info have been saved.

クラッシュした後、もう一度アプリを起動すると、クラッシュレポートを送信しているようなログが出力されました。

BugSense --> Processing crash report...
BugSense --> Crashed on 2014-05-03 17:18:53 +0000, with signal SIGABRT (code #0, address=0x2002a6a)
BugSense --> Posting analytics data...
BugSense --> Generating JSON data from crash report...
# ...(略)...
BugSense --> Server responded with status code: 200
BugSense --> crashCount: 1

クラッシュした直後にクラッシュ情報を送信できるとは限らないので、一度ストレージなどに情報を保存していて、次回の起動時に送信しているようです。

クラッシュ分析をする

こうして送信されたクラッシュ情報は、ダッシュボードに反映されます。
スクリーンショット 2014-05-04 2.24.16
詳細を開いてみると、スタックトレースだけでなく、クラッシュ時の状況に関して詳しく知ることができます。
スクリーンショット 2014-05-04 2.23.00
たとえば、OSやアプリのバージョン、端末のモデルなどはもちろんなのですが、ネットワーク環境や、メモリの使用量も分かるので、原因究明のヒントになります。
更に、スタックトレースなどから同じ種類のクラッシュは、ひとつの問題にまとめられます。日別にそのクラッシュがどの程度出ているかなども確認できるので、いつから発生している問題なのかも分かります。
また修正ステータスも管理できるので、このままタスク管理ツールのようにも使えそうです。
別の画面からは、ユニークユーザーなどの情報も確認できます。
スクリーンショット 2014-05-04 2.22.34
アプリがクラッシュしていない場合にもデータを送信しているので、アップデートの進捗なども確認できるようです。

価格はエラー数と機能に応じたプラン制

価格は、主にエラー数によるプラン制になっています。無料のプランをもあります。

プラン名 エラー数 価格
Free 500件/月 無料
Indie 25,000件/月 $19/月
Plus 150,000件/月 $99/月
Enterprise 無制限

プランによって追加機能もあり、下位プランではデータ保持期間も短くなっています。それなりの規模のアプリでは、上位プランの選択が良さそうです。

まとめ

クラッシュ時のスタックトレースを取るだけであれば、自分でUncaughtExceptionHandlerの類を実装して、サーバにデータ送信するだけなので、ツールを購入するほどのものでもありません。
BugSenseなどのクラッシュレポートサービスは、クラッシュ情報をまとめて見せていることに価値があります。
たとえば、今までに発生していなかった問題が発生した場合にも検知できますし、問題の発生原因がOSや端末にある場合は、それも統計情報から推測できます。クラッシュの影響範囲も分かるので、修正の優先順位付けにも役立ちます。グラフの表示があるので、修正した結果、問題が緩和されるのが可視化されるのも良いです。

参考ページ

超簡単!BugSenseでスマホアプリ/サイトのクラッシュ統計をとろう
Splunk Acquires BugSense, A Platform For Analyzing Mobile Data

タイトルとURLをコピーしました