偵錯發布版本
符號化堆疊追蹤
若 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
。這被稱為 符號化。
您可以通過將堆疊追蹤和產生的來源地圖傳遞給 metro-symbolicate
,來符號化像上面這樣的精簡函式名稱和位元組碼。
啟用來源地圖
符號化堆疊追蹤需要來源地圖。請確保已在目標平台的建置配置中啟用來源地圖。
- Android
- iOS
資訊
在 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
資訊
在 iOS 上,來源地圖預設為停用。請使用以下說明來啟用它們。
若要啟用來源地圖生成
- 開啟 Xcode 並編輯建置階段 "Bundle React Native code and images"。
- 在其他 exports 上方,新增一個帶有期望輸出路徑的
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
立即成功退出,請確保輸入來自管道或重定向,而不是來自終端機。