Skip to content

iOS 崩溃报告符号化

调试 iOS 应用程序崩溃有时涉及分析崩溃报告。 更多关于崩溃报告的信息可以在 Apple 文档中找到。

崩溃报告通常需要符号化才能变得可读性良好:符号化将机器代码地址转换为人类可读的源代码位置。 以下文档描述了使用 Kotlin 符号化 iOS 应用程序崩溃报告的一些具体细节。

为发布 Kotlin 二进制文件生成 .dSYM

要符号化 Kotlin 代码中的地址(例如,针对 Kotlin 代码对应的堆栈跟踪元素),针对 Kotlin 代码的 .dSYM bundle 是必需的。

默认情况下,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 bundle 随后会被 Xcode 自动发现。

使用从 bitcode 重建时将框架设为静态

从 bitcode 重建 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
        }
    }
}