モバイル開発者チェックリスト
プロファイリング

クラッシュ

クラッシュ時のチェックリスト

  • コードストリッピングを無効化(また iOS では “slow with exceptions” をセット)
  • ビルドした iOS プレイヤーのサイズ最適化の手順に従い、iOS のストリッピングによりクラッシュさせない
  • メモリ不足が原因でないことを確認(デバイスを再起動、そのプラットフォームで最大量の RAM を使用するようにして、ログを観察)

Editor.log - エディター上の場合

デバッグメッセージ、警告、およびエラーはすべてコンソールに出力されます。また Unity はステータスレポート、すなわちアセットのロード、Mono 初期化、グラフィックスドライバ情報などをコンソールに出力します。

何が起きているかを理解したい場合は editor.log を確認することです。ここではコンソールによる部分的な情報ではなく、全体像をつかむことができます。何が起きているかを理解し、またコーディングセッションの完全なログを観察できます。何によって Unity がクラッシュしたのか、アセットにどういう問題があったのか追跡することができます。

Unity はデバイスの情報を出力します。Android では logcat コンソール、iOS では Xcode gdb コンソールに出力します。

Android でデバッグ

  1. DDMS または ADB ツールを使用
  2. スタックトレースを観察( Android 3 以上)。c++filt ( ndk の一部) または別の方法、すなわち: http://slush.warosu.org/c++filtjs、のいずれかを使用して、マネージド関数コールをデコード
  3. クラッシュが発生した .so ファイルをチェック:
    1. libunity.so - クラッシュは Unity コードまたはユーザーコードです。
    2. libdvm.so - クラッシュは Java 内のどこかの Dalvik です、ですので Dalvik のスタックトレースから JNI コードや Java 関連( AndroidManifest.xml への変化の可能性を含みます)を見て探してください。
    3. libmono.so - Mono のバグや、Mono に強く拒否される何かを行っている。
  4. もしクラッシュログで分からない場合、逆アセンブルして何が起きたか大体分かるようにする
    1. このような形で Android の NDK からの ARM EABI ツールを使用します。objdump.exe -S libmono.so >> out.txt
    2. スタックトレースから PC 周りのコードを見てください。
    3. 新しい out.txt ファイル内でコードを一致させてみてください。
    4. 機能の内部で何が起こっているのかを理解するためスクロールアップしてください。

iOS でデバッグ

  1. Xcode はビルトインのツールがある。Xcode 4 はクラッシュのデバッグに優れたツールがあるが、Xcode 3 はやや少ない

  2. 完全な gdb スタック - すべてのバックトレース

  3. soft-null-check を有効化: Development ビルドおよび Script Debugging を有効化します。これで catch できなかった null ref 例外が Xcode コンソールに、適切なマネージドコールスタックとともに、出力されます。

  4. “fast script call” およびコードストリッピングを無効化。ランダムなクラッシュ、すなわち稀な .Net 関数または reflection によるも、を防止するかもしれない

考え方

  1. どのスクリプトでクラッシュが起きたかを見つけて、デバイス上で Mono Develop を使用してデバッグ
  2. もしクラッシュの原因がコードでない場合、スタックトレースをより詳細に観察して何が起きたかのヒントを得る。コピーをとったうえでクラッシュレポートを提出して、解析を依頼
モバイル開発者チェックリスト
プロファイリング