UnityのCrash and Exception Reportingを活用しよう!

44.5K Views

December 18, 22

スライド概要

UnityのCrash and Exception Reportingについての解説記事です。

https://meetup.unity3d.jp/jp/events/1384

profile-image

Unityエンジニアです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Unityの Crash and Exception Reportingを 活用しよう! 2022/12/18 とりすーぷ

2.

自己紹介 • とりすーぷ • 株式会社バーチャルキャスト所属 • Unityエンジニア • 最近はメタバースを作ってます • UniRx/UniTask完全理解という本を出しました

3.

今回の内容 リリースビルドで発生した 「エラーやクラッシュログ」を サーバー側で調べる方法 について話します

4.

環境 • Unity 2022.1.23fで資料作りました • Unity 2021系とはUI周りが少し異なるかも

5.

目次 • Crash and Exception Reportingの概要 • 設定方法 • ログの見方 • カスタムメタ情報の設定 • クラッシュの調べ方

6.

Crash and Exception Reportingの概要

7.

Crash and Exception Reporting • 「Unity Cloud Diagnostics」の機能 • アプリ上で発生した例外やクラッシュログを Web上のダッシュボードで確認できるようになる機能 • 無料で使える(ただしフル機能はPlus/Pro限定)

8.

できること • エラー発生時のスタックトレースの閲覧 • 未処理例外 or Debug.LogExceptionがサーバに記録される • 発生環境の詳細なメタ情報 • PCスペック、デバイス情報、解像度情報などなど • カスタムメタ情報の追加※ • 直前に出力されたDebug.Log情報※ ※ Unity Plus/Pro限定

9.

プランごとの違い Unity Personal Unity Plus/Pro レポート数 25件/日 10000件/日 データの保持期間 7日間 90日間 1ユーザあたりの ストレージ 10MB/日 1GB/日 カスタムメタ情報 ☓ ○ Debug.Logの閲覧 ☓ ○

10.

設定方法

11.

1. ServiceのWindowをEditorで開く

12.

2. PackageManagerが開くので「Configure」を押す

13.

3. Organizationsを設定して「Create Project Id」

14.

4. アプリの対象年齢の質問に答えてSave

15.

5. Clound Diagnosticsの設定を開く

16.

6. 設定 UnityEditor上で発生したログも サーバに記録するか (普段はOFF推奨)

17.

6. 設定 記録するDebug.Logの行数

18.

ログの見方

19.

ダッシュボードを開く ここを押すとWebページが開く

20.

ダッシュボード(全景)

21.

ダッシュボード(全景) 発生頻度グラフ レポート一覧

22.

フィルター機能あります

23.

試しにログを出してみる

24.

ログを出してみた

25.

ダッシュボード上での表示 記録されてる

26.

レポートの詳細 メタ情報 スタックトレース

27.

スタックトレース ThrowErrorSample.csの19行目で例外発生

28.

メタ情報

29.

Debug.Logのログ ※この画像は再現画像です

30.

カスタムメタ情報の追加

31.

カスタムメタ情報の設定 • CrashReportHandler.SetUserMetadata • Key-Value形式でカスタムメタ情報を設定できる

32.

追加されたカスタムメタ情報 ※この画像は再現画像です

33.

クラッシュの調べ方

34.

試しにクラッシュさせてみる

35.

IL2CPPビルドしてクラッシュさせてみた クラッシュログ

36.

クラッシュしたスレッドを特定する StackTraceを開くと、クラッシュした瞬間の すべてのThreadのスタックトレースが列挙される

37.

クラッシュしたスレッドの探し方 原因となったスレッドには(crashed)が付与されている

38.

スタックトレースから原因を調べる クラッシュしたときのスタックトレースが残っているはず…?

39.

スタックトレースから原因を調べる? クラッシュしたときのスタックトレースが残っているはず…? _人人人人人人人人人人_ > 読めない!!!! <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

40.

なぜ? • IL2CPPビルド時にシンボル情報が失われるため • 「メモリアドレス」と「メソッド名」の対照情報が ビルド時に抜け落ちるためログが意味不明になる

41.

対策:シンボルファイルを登録する ビルド時にシンボルファイル(pdb)を作成する

42.

シンボルファイルをアップロードする

43.

シンボルファイルをアップロードする GameAssembly.pdbだけで基本は足りるはず? ↑ Completedになるのを待つ

44.

シンボルアップロード後のクラッシュ スタックトレースが可視化され原因となった場所が 特定できた!

45.

Monoビルド時のクラッシュログは? よ め な い (MonoはJITコンパイルなため) リリース時はIL2CPPを使おう

46.

まとめ

47.

まとめ • アプリリリース時に設定しておくとめっちゃ助かる • ただしPlus/Proじゃないと厳しい • カスタムメタ情報を設定しておくとあとから調べやすい • 「設定したユーザーIDでログを検索」とかができる • クラッシュログ調査はPDBアップロードを忘れずに • IL2CPPビルド時はクラッシュ時でもスタックトレースが追える • ただしMonoビルド時はクラッシュログは読めません

48.

おまけ:Backtrace • https://unity.com/products/backtrace • 有償 • もっと高機能なものが欲しい場合はこちらを使うとよい (らしい)