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
        }
    }
}