メインコンテンツへスキップ

リリースビルドのデバッグ

スタックトレースのシンボリケート

React Nativeアプリがリリースビルドで未処理の例外をスローした場合、出力が難読化されて読みにくくなることがあります。

shell
07-15 10:58:25.820 18979 18998 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
07-15 10:58:25.820 18979 18998 E AndroidRuntime: Process: com.awesomeproject, PID: 18979 07-15 10:58:25.820 18979 18998 E AndroidRuntime: com.facebook.react.common.JavascriptException: Failed, js engine: hermes, stack:
07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132161
07-15 10:58:25.820 18979 18998 E AndroidRuntime: p@1:132084
07-15 10:58:25.820 18979 18998 E AndroidRuntime: f@1:131854
07-15 10:58:25.820 18979 18998 E AndroidRuntime: anonymous@1:131119

上記のスタックトレースでは、p@1:132161のようなエントリは、ミニファイされた関数名とバイトコードのオフセットです。これらの呼び出しをデバッグするには、これらをファイル名、行番号、関数名(例: AwesomeProject/App.js:54:initializeMap)に変換する必要があります。これはシンボリケート (symbolication) として知られています。

上記のようなミニファイされた関数名とバイトコードは、スタックトレースと生成されたソースマップをmetro-symbolicateに渡すことでシンボリケートできます。

ソースマップの有効化

スタックトレースをシンボリケートするにはソースマップが必要です。対象プラットフォームのビルド設定でソースマップが有効になっていることを確認してください。

情報

Androidでは、ソースマップはデフォルトで有効になっています。

ソースマップ生成を有効にするには、android/app/build.gradleに以下のhermesFlagsが存在することを確認してください。

groovy
react {
hermesFlags = ["-O", "-output-source-map"]
}

正しく設定されていれば、Metroのビルド出力中にソースマップの出力場所が表示されるはずです。

text
Writing bundle output to:, android/app/build/generated/assets/react/release/index.android.bundle
Writing sourcemap output to:, android/app/build/intermediates/sourcemaps/react/release/index.android.bundle.packager.map

metro-symbolicateの使用

ソースマップが生成されるようになったので、スタックトレースを変換できます。

shell
# Print usage instructions
npx metro-symbolicate

# From a file containing the stack trace
npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt

# From adb logcat (Android)
adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map

ソースマップに関する注意点

  • ビルドプロセスによって複数のソースマップが生成される場合があります。必ず例に示されている場所にあるものを使用してください。
  • 使用するソースマップが、クラッシュしたアプリの正確なコミットに対応していることを確認してください。ソースコードのわずかな変更が、オフセットに大きな違いを生じさせることがあります。
  • metro-symbolicateがすぐに成功して終了する場合は、入力がターミナルからではなく、パイプやリダイレクトから来ていることを確認してください。