unityでいってみよう!

unityがチョットワカル位の人のブログ

Android Logcatからsymbolicateしてみよう!

はじめに

アプリケーションがクラッシュした時、Logcatにはクラッシュがどのようなフローで発生したかを確認する為のスタックトレース情報が表示されます。

f:id:kimukats:20211004103945p:plain

しかしながら、スタックトレースは16進のアドレスとsoファイルの組み合わせで表示される為、このままでは人間には理解出来ません。 この情報を人間が読めるフォーマットへ変換することをシンボリケートと呼びます。 これまではAndroidプラットフォームの場合、シンボリケートを行う為にはコマンドラインのツールを駆使する必要がありちょっと難しい雰囲気がありましたが、Unityが公開しているAndroid Logcatから容易にシンボリケートが可能となりました。

Android Logcat

Android LogcatはUnityEditor上でLogcatの情報を表示する為パッケージですが、シンボリーケートやメモリ関連の情報を確認することが可能です。 Android Logcatはパッケージマネージャーからインストール可能です。

インストール

Window > Package ManagerからPackage Manager WIndowを起動します。

f:id:kimukats:20211004121348p:plain

Unity Registryを選択するとAndroid Logcatがリストアップされるので、Installボタンを押します。

Android Logcatでシンボリケートかいつのバージョンから使用出来るようになったか不明ですが、現在公開されている1.2.3以降であればシンボリケートを行うことが可能です。

シンボルファイルの入手

シンボルファイルはシンボリケートを行う為に必要な情報が詰まった必須ファイルです。 このファイルの一番簡単な取得方法はビルド時にCreate symbol.zipにチェックを入れてビルドを行うことです。

f:id:kimukats:20211004121857p:plain

このZIPファイルを展開し、Editor > Project Settings > Analysis > Android Logcat Settings からシンボルファイルを設定します。 画面右側の+ボタンを押してください。 Pickup Custom Location から展開したフォルダを指定します。

f:id:kimukats:20211004131624p:plain

シンボルファイルが無い場合、例えば他の人がビルドを行ったAPKをシンボリケートを行う場合、スタックトレースのこの部分に表示されている内容を参照してください。

f:id:kimukats:20211004124940p:plain

その設定に合わせてシンボルを選択します。

f:id:kimukats:20211004132515p:plain

この場合、libmain.soとlibunity.soに含まれるコードのシンボリケートは可能ですが、libil2cpp.soに含まれるコードに関してはシンボリケート出来ません。

シンボリケートしてみよう!

Window > Analayze > Andoroid LogcatからAndoroid Logcatを起動します。

f:id:kimukats:20211004133101p:plain

クラッシュが発生したらAndoroid LogcatのtoolsボタンからStacktrace Utilityを選択します。

f:id:kimukats:20211004133240p:plain

f:id:kimukats:20211004133345p:plain
Stacktrace Utility

Android Logcateではスタックトレースの情報が赤色で表示されているのそれをまるっとコピーしてStacktrace UtilityのOriginal Tab側にペーストします。

f:id:kimukats:20211004133640p:plain

画面右上のResolve Stacktracesボタンを押します。

f:id:kimukats:20211004133811p:plain

文字列の色が緑色になった部分がシンボリケートされたことによって変わった部分です。

f:id:kimukats:20211004134915g:plain

例えば#00 pc 000f2224の部分が、il2cpp::vm::GetReducedType(Il2CppClass const*) at C:\Program Files\Unity\Hub\Editor\2020.3.18f1\Editor\Data\il2cpp\libil2cpp\vm/Class.cpp:?となり、実際にどのクラスの何行目でクラッシュが発生したのかを確認することが出来ます。 赤色の部分はシンボリケート出来なかった部分です。libart.so not foundとなっており、これはシンボルファイルlibart.soが見つからなかったことを表します。libart.soを何処からか入手できれば、Pickup Custom Locationから指定を行うことでシンボリケートを行いことは可能な筈です。

まとめ

  • Android Logcatでスタックトレースのシンボリケートが可能
  • シンボリケートを行う為にはシンボルファイルが必要
  • シンボルファイルはビルド時にCreate symbol.zipにチェックを入れることで生成されるZIPファイルから入手する

以上