跳到主要內容

偵錯發布版本

符號化堆疊追蹤

若 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 上,來源地圖預設為啟用

若要啟用來源地圖生成,請確保以下 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

使用 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 立即成功退出,請確保輸入來自管道或重定向,而不是來自終端機。