Skip to content

符號化 iOS 閃退報告

除錯 iOS 應用程式的閃退有時需要分析閃退報告。 更多關於閃退報告的資訊可在 Apple 文件 中找到。

閃退報告通常需要經過符號化才能變得易於閱讀:符號化將機器碼位址轉換為人類可讀的原始碼位置。 以下文件描述了使用 Kotlin 的 iOS 應用程式符號化閃退報告的一些具體細節。

為發佈版 Kotlin 二進位檔生成 .dSYM

為了符號化 Kotlin 程式碼中的位址(例如,對應於 Kotlin 程式碼的堆疊追蹤元素),需要用於 Kotlin 程式碼的 .dSYM 軟體包。

預設情況下,Kotlin/Native 編譯器會在 Darwin 平台上為發佈版(即優化過的)二進位檔生成 .dSYM。這可以使用 -Xadd-light-debug=disable 編譯器旗標來禁用。同時,此選項在其他平台上預設是禁用的。要啟用它,請使用 -Xadd-light-debug=enable 編譯器選項。

kotlin
kotlin {
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        binaries.all {
            freeCompilerArgs += "-Xadd-light-debug={enable|disable}"
        }
    }
}
groovy
kotlin {
    targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
        binaries.all {
            freeCompilerArgs += "-Xadd-light-debug={enable|disable}"
        }
    }
}

在從 IntelliJ IDEA 或 AppCode 範本建立的專案中,這些 .dSYM 軟體包會被 Xcode 自動發現。

從位元碼重建時將框架設定為靜態

從位元碼重建 Kotlin 生成的框架會使原始的 .dSYM 失效。 如果在本地執行,請確保在符號化閃退報告時使用更新後的 .dSYM

如果重建是在 App Store 端執行,那麼重建的 動態 框架的 .dSYM 似乎會被捨棄,並且無法從 App Store Connect 下載。 在這種情況下,可能需要將框架設定為靜態。

kotlin
kotlin {
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        binaries.withType<org.jetbrains.kotlin.gradle.plugin.mpp.Framework> {
            isStatic = true
        }
    }
}
groovy
kotlin {
    targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
        binaries.withType(org.jetbrains.kotlin.gradle.plugin.mpp.Framework) {
            isStatic = true
        }
    }
}