iOS 符號

macOS、tvOS 和 iOS 當機報告會在發生當機時顯示應用程式所有執行中線程的堆疊追蹤。 堆疊追蹤只包含記憶體位址;不是瞭解當機所需的類別名稱、方法、檔案名或行號。

若要取得翻譯的記憶體位址,您需要將 dSYM 套件上傳至 App Center,其中包含符號化所需的所有資訊。 您可以從 Apple 的官方開發人員檔深入瞭解符號。

App Center 組建和散發服務可以自動產生有效的 dSYM 和來源對應 .zip 檔案,並將檔案上傳至診斷服務。 如果您使用 App Center 來建置應用程式並自動散發給終端使用者,則不需要手動取得並上傳符號檔。

未受限制的當機

Unsymbolicated 當機會顯示在 App Center 診斷區段中,讓您即使在上傳符號之前,也可以檢視一些詳細資料。 這些損毀的遺漏符號會顯示在 [未隔離] 索引標籤中。如果上傳遺漏的符號,則未隔離的當機群組將會由符號化損毀群組取代。

尋找套件 .dSYM 組合

  1. 在 Xcode 中,開啟 [視窗] 功能表,然後選取 [ 召集人]。
  2. 選取 [ 封存] 索引標籤。
  3. 在左側提要欄位中選取您的應用程式。
  4. 以滑鼠右鍵按一下最新的封存,然後選取 [ 在 Finder 中顯示]。
  5. 以滑鼠右鍵按一下 .xcarchive Finder 中的檔案,然後選取 [ 顯示套件內容]。
  6. 您應該會看到名為 dSYMs 的資料夾,其中包含您的 dSYM 套件組合。
  7. 建立 dSYM 套件組合的 ZIP 檔案。

如果您使用 Visual Studio 而不是 Xcode,請參閱 哪裡可以找到 dSYM 檔案來符號化 iOS 損毀記錄? 以尋找 dSYM 檔案。

上傳符號

App Center 入口網站

  1. 登入 App Center 並選取您的應用程式。
  2. 在左側功能表中,流覽至 [ 診斷] 區 段,然後選取 [ 符號]。
  3. 在右上角,按一下 [ 上傳符號 ] 並上傳檔案。
  4. App Center 為符號編制索引之後,系統會為您符號損毀。

React Native iOS 應用程式

若要取得 iOS 檔案React Native符號檔,請在 Mac 上建立具有 dSYM 套件的 ZIP 檔案,以及應用程式的 JavaScript 來源對應。 來源對應應該命名為 index.ios.map 。 下列命令會產生發行組建的來源對應:

react-native bundle --entry-file index.ios.js --platform ios --dev false --reset-cache --bundle-output unused.jsbundle --sourcemap-output index.ios.map

App Center API

透過 API 上傳符號的程式牽涉到一系列三個 API 呼叫:一個用來配置後端空間、一個用來上傳檔案,另一個用來更新上傳的狀態。 第一個 API 呼叫的主體應該設定 symbol_typeApple

  1. POST觸發對 symbol_uploads API的要求。 此呼叫會在後端為您的檔案配置空間,並傳 symbol_upload_id 回 和 upload_url 屬性。
curl -X POST 'https://api.appcenter.ms/v0.1/apps/{owner_name}/{app_name}/symbol_uploads' \
    -H 'accept: application/json' \
    -H 'X-API-Token: {API TOKEN}' \
    -H 'Content-Type: application/json' \
    -d '{JSON BODY}'
  1. upload_url使用從第一個步驟傳回的屬性,以標頭提出 PUT 要求, "x-ms-blob-type: BlockBlob" 並提供磁片上檔案的位置。 此呼叫會將檔案上傳至後端儲存體帳戶。 深入瞭解 PUT Blob 要求標頭
curl -X PUT '{upload_url}' \
    -H 'x-ms-blob-type: BlockBlob' \
    --upload-file '{path to file}'
  1. 使用從第一 PATCH 個步驟傳回的屬性,向symbol_uploads API提出要求。 symbol_upload_id 在要求的本文中,指定您要將上傳 committed 狀態設定為 () 上傳程式順利完成,還是 aborted (未順利完成) 。
curl -X PATCH 'https://api.appcenter.ms/v0.1/apps/{owner_name}/{app_name}/symbol_uploads/{symbol_upload_id}' \
    -H 'accept: application/json' \
    -H 'X-API-Token: {API TOKEN}' \
    -H 'Content-Type: application/json' \
    -d '{ "status": "committed" }'

注意

符號上傳 API 不適用於大於 256MB 的檔案。 使用 App Center CLI 上傳這些檔案。 您可以遵循 App Center CLI 存放庫中的指示來安裝 App Center CLI。

App Center CLI

您也可以使用 CLI 來上傳符號檔:

appcenter crashes upload-symbols --symbol {symbol file}

Bitcode

Bitcode 是由 Apple 引進,可讓應用程式傳送至App Store由 Apple 本身重新編譯,並套用最新的優化。 如果已啟用 Bitcode,在市集中為您的應用程式產生的符號會與您自己的組建系統不同。

App Center 當機報告尚未完全支援來自已啟用 bitcode 的應用程式損毀的符號。 同時,建議您 停用 bitcode。 停用 bitcode 可大幅簡化符號管理,目前沒有 iOS 應用程式的已知缺點。

停用應用程式的 bitcode

  1. 在 Xcode 中,按一下 [專案導覽] 中的最上層專案,以開啟您的專案設定
  2. 移至 [組建設定] 頁面
  3. 搜尋 bitcode
  4. 在結果中,將值從 [是] 變更為 [否]
  5. 重建您的應用程式

透過這些簡單的步驟,App Center 當機報告會如往常般運作。

擷取已啟用 bitcode 的應用程式符號

如果您想要保持啟用 bitcode,您可以遵循下列步驟下載適當的 dSYM 檔案:

  1. 開啟 Xcode 的召集人
  2. 選取您上傳至 iTunes Connect 的應用程式特定封存
  3. 按一下 [下載 dSYM] 按鈕。 此步驟會將 Bitcode 編譯的 dSYM 檔案插入原始封存。
  4. 將符號上傳至 App Center 中的對應應用程式和版本

如果 Xcode 召集人未提供任何新符號,您必須遵循下列步驟,從 iTunes Connect 入口網站下載 dSYM 檔案:

  1. 在 iTunes Connect 入口網站中選取您的應用程式
  2. 選取頂端的 [活動] 索引標籤
  3. 選取具有遺漏符號之應用程式的組建版本
  4. 按一下 [下載 dSYM] 連結
  5. 將下載的檔案上傳至 App Center。 此檔案包含 App Center 簽署損毀所需的符號。

針對符號問題進行疑難排解

如果您的當機在上傳符號並停用 bitcode 之後仍顯示為未受限制,可能是因為上傳的 dSYM 檔案不符合 App Center 所需的檔案。 當您上傳 dSYM 檔案時,App Center 會根據其 UUID 將它們比對到正確的應用程式版本。

您可以使用名為 dwarfdump的 CLI 工具,再次檢查 dSYM 檔案是否有正確的 UUID。

  1. 在 dSYM 檔案中尋找 UUID:
dwarfdump --u CrashProbeiOS.app.dSYM
  1. 結果應該會看起來像這樣:
UUID:ADF53C85-4638-3EFF-A33C-42C13A18E915 (armv7)CrashProbeiOS.app.dSYM/Contents/Resources/DWARF/CrashProbeiOS
UUID:D449E33D-7E74-379D-8B79-15EE104ED1DF (arm64)CrashProbeiOS.app.dSYM/Contents/Resources/DWARF/CrashProbeiOS
  1. 再次檢查傳回的 UUID 是否符合 [偵錯符號] 對話方塊中顯示的 UUID:

App Center 會顯示必要符號的 UUID

忽略符號

當 App Center 沒有所有符號檔可完整符號化當機報告時,當機會列在 [ 未布建 ] 索引標籤中。如果您有存取權,則會從此頁面上傳必要的符號。

如果您無法上傳符號,您可以選取資料表中的資料列並按一下 [忽略版本] 按鈕,將它們標示為[忽略]。 此按鈕會告知 App Center 處理當機,並盡可能使用檔案上的符號來將它們符號符號化。 完成處理之後,它們會出現在 [ 當機 ] 索引標籤中,部分符號化。 同樣取決於標示為忽略之相同符號識別碼的新損毀,將會略過 [ 未區分 ] 索引標籤,因為它們傳入並流經系統。