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

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

スタックトレースのシンボル化

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

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 に変換する必要があります。 これは**シンボル化**として知られています。

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

ソースマップの有効化

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

情報

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

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

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

正しく行われた場合、Metroビルド出力中にソースマップの出力場所が表示されます。

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の使用

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

# 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 がすぐに正常に終了した場合は、入力が端末ではなくパイプまたはリダイレクトからのものであることを確認してください。