リリースビルドのデバッグ
スタックトレースのシンボリケート
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
- iOS
情報
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
情報
iOSでは、ソースマップはデフォルトで無効になっています。有効にするには以下の手順に従ってください。
ソースマップ生成を有効にするには
- Xcodeを開き、ビルドフェーズ「Bundle React Native code and images」を編集します。
- 他のexportの上に、
SOURCEMAP_FILE
エントリを希望の出力パスとともに追加します。
diff
+ SOURCEMAP_FILE="$(pwd)/../main.jsbundle.map";
WITH_ENVIRONMENT="../node_modules/react-native/scripts/xcode/with-environment.sh"
正しく設定されていれば、Metroのビルド出力中にソースマップの出力場所が表示されるはずです。
text
Writing bundle output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle
Writing sourcemap output to:, Build/Intermediates.noindex/ArchiveIntermediates/application/BuildProductsPath/Release-iphoneos/main.jsbundle.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
がすぐに成功して終了する場合は、入力がターミナルからではなく、パイプやリダイレクトから来ていることを確認してください。