👓

quest3のtombstoneを確認する方法

2024/12/18に公開

はじめに

questとandroid初心者すぎて、quest3アプリがクラッシュしたときにどうやって解析すれば良いか分からなかったため備忘録的に残します。もしもっと良い方法をご存知の方いらっしゃいましたらコメント頂けましたら幸いです!!

やり方

環境

  • meta quest3
  • windows11
  • unity 2019.4.33f1, コンパイラ:Mono(古いが、新しいverでもやり方は変わらないはず。il2cppコンパイラを使用する場合はsymbolなど使うのでちょっとやり方変わる?)

事前準備、必要ソフトの導入

  1. pcにadbを導入する(meta quest developer hubが入っていれば、hubのインストール先ディレクトリのbinの中にadbも入ってる)。
    もうadbを導入済であれば不要meta quest developer hubの導入は不要です。
    https://developers.meta.com/horizon/documentation/unity/ts-odh-getting-started#install-meta-quest-developer-hub

adb経由でのtombstoneの取得方法

  1. 以下コマンドを打つ。
    $adb bugreport <自分のpcの好きなディレクトリ¥好きなファイル名>
    
  2. (winの場合)自分のpcの好きなディレクトリ¥好きなファイル名.zipができているので、この中に"どこでクラッシュしたのか、どんなエラーが出ているか"の情報が格納されている
  3. bugreport-xxx.txtというファイルにタイムスタンプとどんなエラーが出たか確認できる(以下みたいな感じ)。具体的にどこのスクリプトでエラーが出たかはbacktraceに書いてある。
    特にクラッシュした箇所はFATALと書いてあるので、これを目印にすると良い。(以下例ではF DEBUGになっていますが、DEBUGではなくFATALと書かれている箇所を探すと見つけやすいです)
03-02 23:53:49.477 17951 17951 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-02 23:53:49.477 17951 17951 F DEBUG   : Build fingerprint: 'Android/aosp_angler/angler:7.1.1/NYC/enh12211018:eng/test-keys'
03-02 23:53:49.477 17951 17951 F DEBUG   : Revision: '0'
03-02 23:53:49.477 17951 17951 F DEBUG   : ABI: 'arm'
03-02 23:53:49.478 17951 17951 F DEBUG   : pid: 17946, tid: 17949, name: crasher  >>> crasher <<<
03-02 23:53:49.478 17951 17951 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
03-02 23:53:49.478 17951 17951 F DEBUG   :     r0 0000000c  r1 00000000  r2 00000000  r3 00000000
03-02 23:53:49.478 17951 17951 F DEBUG   :     r4 00000000  r5 0000000c  r6 eccdd920  r7 00000078
03-02 23:53:49.478 17951 17951 F DEBUG   :     r8 0000461a  r9 ffc78c19  sl ab209441  fp fffff924
03-02 23:53:49.478 17951 17951 F DEBUG   :     ip ed01b834  sp eccdd800  lr ecfa9a1f  pc ecfd693e  cpsr 600e0030
03-02 23:53:49.491 17951 17951 F DEBUG   :
03-02 23:53:49.491 17951 17951 F DEBUG   : backtrace:
03-02 23:53:49.492 17951 17951 F DEBUG   :     #00 pc 0004793e  /system/lib/libc.so (pthread_mutex_lock+1)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #01 pc 0001aa1b  /system/lib/libc.so (readdir+10)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #02 pc 00001b91  /system/xbin/crasher (readdir_null+20)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #03 pc 0000184b  /system/xbin/crasher (do_action+978)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #04 pc 00001459  /system/xbin/crasher (thread_callback+24)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #05 pc 00047317  /system/lib/libc.so (_ZL15__pthread_startPv+22)
03-02 23:53:49.492 17951 17951 F DEBUG   :     #06 pc 0001a7e5  /system/lib/libc.so (__start_thread+34)
03-02 23:53:49.492 17951 17951 F DEBUG   :     Tombstone written to: /data/tombstones/tombstone_06
  1. もしbacktraceとmanaged backtraceの2つがある場合、managed backtraceにunityコードのクラッシュポイントが記載されているので、managed backtraceを見ると良い。backtraceはmanaged backtraceのunityコードが呼び出しているため、深入りする場合はこちらも覗いてみる。

もしクラッシュが再現できる場合

  1. もしクラッシュが再現できる場合のリアルタイム分析方法
    • quest3のみをpcに接続し、コマンドプロンプト/shellからadb devicesでquest3のデバイス番号が表示されることを確認する。
    • コマンドプロンプト/shellでadb logcat CRASH:E *:Sを実行すると、CRASH以上のログレベルのみ表示されるようになる。これでクラッシュした瞬間にどんなエラーが出たか確認できる。
    • 確認後、adb bugreport <自分のpcの好きなディレクトリ>でクラッシュレポートを自分のpcに取り寄せて分析できる。コマンドプロンプト/shellで確認できたエラーは、bugreport-xxx.txtにて同じ内容が確認できる。

参考にさせていただいたサイト

下記サイトを参考にさせていただきました、非常にわかりやすかったので、adb logcat CRASH:E *:Sあたりの解説を知りたい方などおすすめです。
https://logicalbeat.jp/blog/8220/

Discussion