44.5K Views
December 18, 22
スライド概要
UnityのCrash and Exception Reportingについての解説記事です。
https://meetup.unity3d.jp/jp/events/1384
Unityの Crash and Exception Reportingを 活用しよう! 2022/12/18 とりすーぷ
自己紹介 • とりすーぷ • 株式会社バーチャルキャスト所属 • Unityエンジニア • 最近はメタバースを作ってます • UniRx/UniTask完全理解という本を出しました
今回の内容 リリースビルドで発生した 「エラーやクラッシュログ」を サーバー側で調べる方法 について話します
環境 • Unity 2022.1.23fで資料作りました • Unity 2021系とはUI周りが少し異なるかも
目次 • Crash and Exception Reportingの概要 • 設定方法 • ログの見方 • カスタムメタ情報の設定 • クラッシュの調べ方
Crash and Exception Reportingの概要
Crash and Exception Reporting • 「Unity Cloud Diagnostics」の機能 • アプリ上で発生した例外やクラッシュログを Web上のダッシュボードで確認できるようになる機能 • 無料で使える(ただしフル機能はPlus/Pro限定)
できること • エラー発生時のスタックトレースの閲覧 • 未処理例外 or Debug.LogExceptionがサーバに記録される • 発生環境の詳細なメタ情報 • PCスペック、デバイス情報、解像度情報などなど • カスタムメタ情報の追加※ • 直前に出力されたDebug.Log情報※ ※ Unity Plus/Pro限定
プランごとの違い Unity Personal Unity Plus/Pro レポート数 25件/日 10000件/日 データの保持期間 7日間 90日間 1ユーザあたりの ストレージ 10MB/日 1GB/日 カスタムメタ情報 ☓ ○ Debug.Logの閲覧 ☓ ○
設定方法
1. ServiceのWindowをEditorで開く
2. PackageManagerが開くので「Configure」を押す
3. Organizationsを設定して「Create Project Id」
4. アプリの対象年齢の質問に答えてSave
5. Clound Diagnosticsの設定を開く
6. 設定 UnityEditor上で発生したログも サーバに記録するか (普段はOFF推奨)
6. 設定 記録するDebug.Logの行数
ログの見方
ダッシュボードを開く ここを押すとWebページが開く
ダッシュボード(全景)
ダッシュボード(全景) 発生頻度グラフ レポート一覧
フィルター機能あります
試しにログを出してみる
ログを出してみた
ダッシュボード上での表示 記録されてる
レポートの詳細 メタ情報 スタックトレース
スタックトレース ThrowErrorSample.csの19行目で例外発生
メタ情報
Debug.Logのログ ※この画像は再現画像です
カスタムメタ情報の追加
カスタムメタ情報の設定 • CrashReportHandler.SetUserMetadata • Key-Value形式でカスタムメタ情報を設定できる
追加されたカスタムメタ情報 ※この画像は再現画像です
クラッシュの調べ方
試しにクラッシュさせてみる
IL2CPPビルドしてクラッシュさせてみた クラッシュログ
クラッシュしたスレッドを特定する StackTraceを開くと、クラッシュした瞬間の すべてのThreadのスタックトレースが列挙される
クラッシュしたスレッドの探し方 原因となったスレッドには(crashed)が付与されている
スタックトレースから原因を調べる クラッシュしたときのスタックトレースが残っているはず…?
スタックトレースから原因を調べる? クラッシュしたときのスタックトレースが残っているはず…? _人人人人人人人人人人_ > 読めない!!!! <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
なぜ? • IL2CPPビルド時にシンボル情報が失われるため • 「メモリアドレス」と「メソッド名」の対照情報が ビルド時に抜け落ちるためログが意味不明になる
対策:シンボルファイルを登録する ビルド時にシンボルファイル(pdb)を作成する
シンボルファイルをアップロードする
シンボルファイルをアップロードする GameAssembly.pdbだけで基本は足りるはず? ↑ Completedになるのを待つ
シンボルアップロード後のクラッシュ スタックトレースが可視化され原因となった場所が 特定できた!
Monoビルド時のクラッシュログは? よ め な い (MonoはJITコンパイルなため) リリース時はIL2CPPを使おう
まとめ
まとめ • アプリリリース時に設定しておくとめっちゃ助かる • ただしPlus/Proじゃないと厳しい • カスタムメタ情報を設定しておくとあとから調べやすい • 「設定したユーザーIDでログを検索」とかができる • クラッシュログ調査はPDBアップロードを忘れずに • IL2CPPビルド時はクラッシュ時でもスタックトレースが追える • ただしMonoビルド時はクラッシュログは読めません
おまけ:Backtrace • https://unity.com/products/backtrace • 有償 • もっと高機能なものが欲しい場合はこちらを使うとよい (らしい)