XCODEで、クラッシュログからの問題特定

SurfTideΔで、ダークモード化も終わりベータ公開しようと思った矢先に原因不明のクラッシュ…
それも、再現できないやつ
しょうがないので、クラッシュログをチェックすることにしました。release版ではなくdebug版で動かした場合のクラッシュログからの問題特定です。
以下、忘れそうなので備忘録

clashファイルの抽出
デバイスをUSBで接続して
Xcode -> Window -> Organizer からターゲットデバイスの対象アプリのクラッシュログ「.crash」をEXPORTする。
EXPORTしたファイルから「Binary Images:」の行を探す

Binary Images:
0x104d34000 - 0x10527ffff SurfTideDelta arm64  <8267be10a1c13ae5aca23824a8718b62> /var/containers/Bundle/Application/5A178E33-927C-4E39-

直下にあるアドレス(上記だと「0x104d34000」)で「.crash」ファイルを検索する

8   SurfTideDelta        0x0000000104df0d48 0x104d34000 + 773448
9   SurfTideDelta        0x0000000104df26f0 0x104d34000 + 780016
10  SurfTideDelta        0x0000000104db68e0 0x104d34000 + 534752

こんな感じの行がみつかるので以下のコマンドを実行

atos -o SurfTideDelta.app.dSYM/Contents/Resources/DWARF/SurfTideDelta -arch arm64 -l 0x104d34000 0x0000000104df0d48

ある程度何処でクラッシュしたか絞り込める(ハズ)

+[FIRInstanceIDTokenOperation requestWithAuthHeader:FISAuthToken:] (in SurfTideDelta) (FIRInstanceIDTokenOperation.m:206)

ちなみに、SurfTideDeltaはどうもADMOBのインプリメントで Firebase/Admob を使っていたのだけど、どうもそのあたりの障害だったようです。
なので、実装を替えて問題を解決(たぶん)しました。

以下、おまけ

たぶんrelease版からだともう1手間必要みたいです。
以下それのメモ

適当なワークフォルダ(ここでは dbg_work)を作成する。

必要ファイルの抽出
Xcode -> Window -> Organizer からターゲットアプリをCtrl+クリックでFinderに表示して以下の2ファイルを「dbg_work」フォルダにコピーしておく。

{buildAppName}.xcarchive/Products/Applications/{AppName}.app
{buildAppName}.xcarchive/dSYMs/{AppName}.dSYM

dSYMからUUIDを抽出
「dbg_work」フォルダをルートにしてターミナルを開く
以下コマンドでUUIDを調べる

xcrun dwarfdump --uuid {AppName}.app.dSYM/Contents/Resources/DWARF/{AppName}

以下、「SurfTideDelta」アプリでのサンプルで説明

> UUID: 468864FD-FDD2-308B-B51F-57EE5F99XXZZ (arm64) SurfTideDelta.app.dSYM/Contents/Resources/DWARF/{AppName}

468864FD-FDD2-308B-B51F-57EE5F99XXZZ が固有のUUID
(arm64) がアーキテクチャ

これから先は先述と同じです。ただ「Binary Images:」を探すのに UUID をキーに使うのが違います。(たぶん)