# エラーの調査とスタックトレースの復元

失敗した更新とイベントを特定し、同じビルドで生成したソースマップからエラーの発生箇所を調べます。

## この順序で診断します {#start}

1. 影響を受けるデバイスで `getUpdateMetadata().currentVersion` を使用して **アップデートを特定**します。記録時間とネイティブバージョン。
2. 単なるスクリーンショットではなく、キャプチャされた JS エラーまたは既存のクラッシュ レポーターから **スタックを収集**します。
3. 正確な `.ppk` ビルドから **一致するマップを見つけます**。新しく再構築されたマップは代わりにはなりません。
4. ソースの場所を**シンボル化して検証**し、新しいリリースを修正してテストします。

## なぜそれが重要なのか {#why}

最も恐ろしい OTA シナリオ: アップデートはすでにユーザーのデバイスにあり、一部のモデルでは画面が真っ白になり、「ユーザーは開かないと言う」だけです。 Pakta は、JS エラー報告パイプラインを SDK に構築します。エラーが発生すると、**アクティブな更新 ID** (appKey、ネイティブ パッケージ バージョン、アクティブな更新ハッシュ) とともに報告されるため、「どのバージョンが失敗しているか」が 1 つのクエリ可能なフィールドになります。

## 自動レポート {#automatic}

初期化後、SDK は React Native のグローバル `ErrorUtils` にチェーンします。これは既存のハンドラーを置き換えるのではなく、その後に実行されます。

- キャッチされなかった JS 例外は自動的に報告されます。
- 報告されたペイロード: エラー メッセージ、JS スタック、更新 ID および基本的なデバイス情報。
- レポートは、テレメトリの更新と同じサービス構成を共有します。

JS エラー報告のみをオプトアウトするには:

```tsx
const updateClient = new Pakta({
  appKey,
  disableErrorReporting: true, // disable JS error reporting only
  // disableTelemetry: true,   // also disable update lifecycle telemetry
});
```

## 手動キャプチャ {#capture}

キャッチされた例外 (API レイヤーで試行/キャッチしたものなど) はデフォルトでは報告されません。重要な場合は明示的に送信してください。

```tsx
// Reuse the existing client created outside the root component.

try {
  await riskyCheckout();
} catch (error) {
  client.captureException(error, { context: 'checkout' });
}
```

コンテキスト オブジェクトはエラーと一緒に保存されます。デバッグ中に必要なビジネス識別子を入れます。

## クラッシュ プラットフォームの相関関係 {#crash-report}

ネイティブ クラッシュと ANR は JS パイプラインの外に存在します。それらを Sentry / Crashlytics に渡し、Pakta が **アクティブな更新 ID** をこれらのレポートに挿入します。

```tsx
import * as Sentry from '@sentry/react-native';
import { attachToSentry } from 'rn-update';

// Call after existing Sentry initialization, passing the reporter.
attachToSentry(Sentry);
```

Sentry ボードを `pakta.currentVersion` でフィルターすると、「これらのクラッシュがクラスターに発生するホット アップデートのバージョン」に答えることができます。

## 記号 {#symbolicate}

`bundle` はデフォルトでソースマップを生成します。 `publish --sourcemap` を使用してアーカイブし、CLI を使用して実稼働スタックをソース位置に戻します。

```bash
pakta symbolicate stack.txt --platform android --hash <UPDATE_HASH>
```

`getUpdateMetadata().currentVersion` から `hash` を取得します。Hermesのソースマップはバンドル時に生成されます。設定方法は[CLIの診断オプション](/docs/cli#diagnostics)を参照してください。

> [!IMPORTANT] プライバシーの境界
> トークン、パスワード、または個人情報をエラー コンテキストやカスタム フィールドに決して入力しないでください。報告されたフィールドはそのままサーバーに保存されます。

## ソースの場所が見つからない場合 {#verify}

`publish --sourcemap` が正常にアーカイブされたこと、ハッシュが失敗した更新に属していること、およびプラットフォームが一致していることを確認してください。埋め込みバンドルには空の currentVersion があり、ネイティブ ビルド マッピング ワークフローが必要です。元のマップがないと、正確なソースの回復は保証されません。
