调试 Release 版本
符号化堆栈跟踪
如果 React Native 应用在 Release 版本中抛出未处理的异常,则输出可能会被混淆且难以阅读。
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
。这被称为 符号化 。
您可以通过将堆栈跟踪和生成的源映射传递给 metro-symbolicate
,来符号化上面这样的精简函数名称和字节码。
启用源映射
源映射是符号化堆栈跟踪所必需的。确保在目标平台的构建配置中启用源映射。
- Android
- iOS
info
在 Android 上,源映射默认是 启用 的。
要启用源映射生成,请确保以下 hermesFlags
存在于 android/app/build.gradle
中。
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
info
在 iOS 上,源映射默认是 禁用 的。使用以下说明启用它们。
启用源映射生成
- 打开 Xcode 并编辑构建阶段 “Bundle React Native code and images”。
- 在其他导出上方,添加一个带有期望输出路径的
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
关于源映射的注意事项
- 构建过程可能会生成多个源映射。请确保使用示例中显示位置的那个。
- 请确保您使用的源映射与崩溃应用的 exact commit 相对应。源代码中的微小更改可能会导致偏移量的大幅差异。
- 如果
metro-symbolicate
立即成功退出,请确保输入来自管道或重定向,而不是来自终端。