Open30

UnityのClash and Exception Reportingを使ってみる

つっちーhidev_つっちーhidev_

Project SettingsServices から、Will this app be primarily targeted to children under age 13? に回答する

つっちーhidev_つっちーhidev_

とりすーぷ先生のコードをそのままお借りして・・・

using System;
using UnityEngine;
using UnityEngine.UI;

public class ClashReportSample : MonoBehaviour
{
    [SerializeField] private Button _errorButton;

    private void Start()
    {
        Debug.Log("Logです");
        Debug.LogWarning("LogWarningです");
        Debug.LogError("LogErrorです");

        _errorButton.onClick.AddListener(() =>
        {
            Debug.Log("onClickを検知");

            throw new SampleException("クラッシュ!");
        });
    }

    private class SampleException : Exception
    {
        public SampleException(string message) : base(message)
        {
            Debug.LogError("SampleExceptionを検知");
        }
    }
}
つっちーhidev_つっちーhidev_

メタ情報とスタックトレースもちゃんと取れてた(スクショ割愛)

つっちーhidev_つっちーhidev_

クラッシュボタン追加

using System;
using UnityEngine;
using UnityEngine.Diagnostics;
using UnityEngine.UI;

public class ClashReportSample : MonoBehaviour
{
    [SerializeField] private Button _errorButton;
    [SerializeField] private Button _crashButton;

    private void Start()
    {
        Debug.Log("Logです");
        Debug.LogWarning("LogWarningです");
        Debug.LogError("LogErrorです");

        _errorButton.onClick.AddListener(() =>
        {
            Debug.Log("_errorButton.onClickを検知");

            throw new SampleException("クラッシュ!");
        });
        _crashButton.onClick.AddListener(() =>
        {
            Debug.Log("_crashButton.onClickを検知");

            UnityEngine.Diagnostics.Utils.ForceCrash(ForcedCrashCategory.AccessViolation);
        });
    }

    private class SampleException : Exception
    {
        public SampleException(string message) : base(message)
        {
            Debug.LogError("SampleExceptionを検知");
        }
    }
}
つっちーhidev_つっちーhidev_

Debugging Symbols からビルドして出力されたPDBファイルをアップロードする

つっちーhidev_つっちーhidev_

差分が分からず・・・

コードをとりすーぷ先生のサンプル通りにする。

using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Diagnostics;
using UnityEngine.UI;

public class ClashReportSample : MonoBehaviour
{
    [SerializeField] private Button _errorButton;
    [SerializeField] private Button _crashButton;

    private void Start()
    {
        Debug.Log("Logです");
        Debug.LogWarning("LogWarningです");
        Debug.LogError("LogErrorです");

        _errorButton.onClick.AddListener(() =>
        {
            Debug.Log("_errorButton.onClickを検知");

            throw new SampleException("クラッシュ!");
        });
        _crashButton.onClick.AddListener(() =>
        {
            Debug.Log("_crashButton.onClickを検知");
            CrashMethod();
        });

        _ = LoopAsync();
    }

    private async Task LoopAsync()
    {
        for (var i = 0; i < 5; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
        }

        Debug.Log("LoopAsyncでクラッシュを検知");
        CrashMethod();
    }

    private void CrashMethod()
    {
        UnityEngine.Diagnostics.Utils.ForceCrash(ForcedCrashCategory.AccessViolation);
    }

    private class SampleException : Exception
    {
        public SampleException(string message) : base(message)
        {
            Debug.LogError("SampleExceptionを検知");
        }
    }
}
つっちーhidev_つっちーhidev_

シンボルファイルについては公式に記載のある通り、Androidは .so ファイルになるらしい。

https://unitytech.github.io/clouddiagnostics/crashesandexceptions/UnityCloudDiagnosticsSymbols.html

Symbol files come in different formats depending on the operating system. Apple platforms use dSYM folders, Android symbols are stored in .so files, and Windows symbols are stored in .pdb files. The crash and exception reporting service can identify and process all of these formats.

つっちーhidev_つっちーhidev_

クラッシュレポート自体はとれるようになったので、一旦切り上げてiOSも見てみる

つっちーhidev_つっちーhidev_

XCodeのアプデ等で四苦八苦してやっとビルド・・・

設定はここみたいだが、ビルド後に該当ファイルがなかった。調べてみるとApp Store ConnectからDLしないと駄目だったりするっぽい?