LogBrew Swift 0.1.6 以降を使ってください。デバッグ用のビルド成果物をアップロードするには、ネイティブ版の LogBrew CLI 0.1.24 以降を使ってください。
取得の範囲を計画する
障害の種類ごとに、アプリが再送できるタイミングを確認します。
リリースの値はビルドの前に設定します。この値で、アプリのバージョンとビルドを特定できる必要があります。SDK、dSYM のアップロード、課題のフィルターで同じ値を使います。
クラッシュのメタデータに、ユーザーのペイロード、リクエストボディ、ヘッダーを付けないでください。
クラッシュ用のプロダクトを追加する
まず、アプリの SDK のテレメトリを設定します。再送ではそのclient と transport を使います。
Swift Package Manager で公開 SDK を追加します。
LogBrew プロダクトを追加します。LogBrewCrash は、アプリでネイティブのクラッシュやハングの取得を明示的に有効にする場合だけ追加します。
この取得の連携は iOS 15 以降に対応しています。ネイティブの致命的エラーのハンドラーはプロセス全体に及ぶため、アプリが所有する取得オブジェクトは1つだけにします。
正確な識別情報を1つに決める
実行時の設定とビルド成果物のアップロードで、同じプロジェクト、リリース、環境、サービスを使います。LogBrew はこれらの値を推測したり置き換えたりしません。NativeCrashConfiguration には省略可能な上限が2つあります。
範囲外の値を指定すると、設定は
crash_invalid_configuration をスローします。
ハングの取得を有効にする
watchdog が nil の場合、ハングの取得はオフです。有効にするには、install() を呼び出す前に、上の watchdog の宣言を次のように置き換えます。
artifactIdentity も必要です。これがないと、設定は crash_invalid_configuration をスローします。
プロセスが動いている間は、crashCapture オブジェクトを1つだけ使い続けます。2つ目の取得オブジェクトはインストールできません。その install() の呼び出しは crash_capture_owned をスローします。しきい値を変えるには、次回のアプリ起動時に新しい値を使います。
回復したハングは、crash.handled を true にして再送されます。プロセスの終了で残った進行中のハングは、crash.handled を false にして再送されます。
どちらの形式にも、数値の durationMs メタデータが含まれます。また、致命的なクラッシュのフレームと同じビルド成果物の識別情報を保持します。
ウォッチドッグは、アプリが非アクティブな間やデバッガーの下にある間は一時停止します。深刻な熱負荷がかかっている間も取得を止めます。
しきい値が短いと、メインスレッドの通常の処理がハングとして報告されることがあります。しきい値は、出荷するビルド設定でテストしてください。処理済みの状態は回復したことを示します。課題が解決したという意味ではありません。処理済みのハングでもインターフェースは止まっていたので、これも確認してください。
起動後に再送する
取得オブジェクトをインストールした後、SDK のクライアントを通して保留中のレポートを再送します。maxReplayBytes より大きいレポートを破棄します。3つの件数をすべて確認してください。保留件数が0というだけでは、送信できたことの証明になりません。
失敗したリクエストを次の再起動の後まで残す必要がある場合は、再送の前に永続的な送信を有効にします。通常のネットワークや認証の回復中に purge() を呼び出さないでください。
一致する dSYM をアップロードする
デバッグ情報を有効にしてアプリをアーカイブします。ユーザーが実行するビルドそのものの dSYM を保管します。 イメージの UUID を確認します。--expect-image-uuid を繰り返します。見つかった UUID の集合が想定と異なる場合、コマンドは失敗します。
アカウントのアクセスを確認します。次に、同じコマンドを --dry-run なしで実行します。
status に表示されます。
ビルドマシンでは、アカウントのアクセスの代わりに、
LOGBREW_TOKEN に設定したプロジェクトのビルド成果物キーでアップロードできます。キーは ビルド成果物キーを作成するの手順で作成します。このアップロードは uploaded を返します。後でアカウントのアクセスを使って、各識別情報を確認します。
status: "found" は、ビルド成果物があることを示します。status: "missing" は、その識別情報のビルド成果物が LogBrew にないことを示します。
解決は、ソースファイル名ではなく、イメージの UUID とビルド成果物の識別情報全体で照合します。同じソースからビルドし直しても、UUID が変わることがあります。ビルドディレクトリ全体ではなく、該当する dSYM バンドルだけをアップロードします。
ホスト側での読み取りを確認する
実行時と同じスコープで課題の一覧を絞り込みます。この例ではunresolved の課題を選びます。解決済みやアーカイブ済みの課題は表示されません。
symbolication オブジェクトが追加されます。この例は、フレームが解決された課題のフィールドの一部です。完全なレスポンスではありません。
クラッシュの証拠を読む
各フレームには個別のstatus があります。symbolication.status フィールドも同じ値を使います。
解決されていないフレームは、メモでも未解決として残します。空のスタックとして報告しないでください。
LogBrew は課題を読むときにフレームを解決します。後からアップロードした dSYM でも、それより前のイベントのフレームを解決できます。イベントが取得していないフレームを追加することはできません。
アプリケーションフレームでコードの検索範囲は絞れますが、原因の証明にはなりません。直前の手順、例外チェーン、トレースの証拠は、課題の調査で読みます。
source: "symbolicated" のフレームはアップロードされたビルド成果物から得たものです。source: "captured" のフレームは、アプリが送信した位置です。レスポンスのフィールドについては 課題を調査するを参照してください。
読み取りのたびに、プロジェクト、リリース、環境、サービスのスコープをすべて保持します。見つからなかったからといって、検索範囲をプロジェクトの外に広げないでください。
本番環境の設定を確認する
デプロイしたビルドで、承認済みのテスト用の障害を使います。顧客の操作をきっかけにしないでください。各項目を順に確認し、最初に失敗したところで止めます。- 実行時の識別情報が、アップロードしたビルド成果物の識別情報と一致します。
- 次回以降の起動で、受け付けられたイベントが1件再送され、破棄と保留のレポートはどちらも0件です。
- スコープを指定した課題の一覧が、想定どおりの処理済みの状態でテストの課題を返します。
- 想定したアプリケーションフレームが解決されます。
- その後の正常な起動で、発生事象が追加されません。
安全に回復する
課題の調査全般については、課題を調査するを参照してください。
