Символизация отчетов об ошибках iOS
Отладка сбоев приложения iOS иногда включает анализ отчетов об ошибках. Дополнительную информацию об отчетах об ошибках можно найти в документации Apple.
Отчеты об ошибках, как правило, требуют символизации для правильного чтения: символизация преобразует адреса машинного кода в удобочитаемые расположения исходного кода. В документе ниже описаны некоторые конкретные детали символизации отчетов об ошибках приложений iOS с использованием Kotlin.
Создание .dSYM для релизных бинарников Kotlin
Для символизации адресов в коде Kotlin (например, для элементов стека, соответствующих коду Kotlin) требуется пакет для кода Kotlin.
По умолчанию компилятор Kotlin/Native генерирует .dSYM для релизных (т. е. оптимизированных) бинарников на платформах Darwin. Это можно отключить с помощью соответствующего флага компилятора. В то же время этот параметр отключен по умолчанию для других платформ. Чтобы включить его, используйте соответствующий параметр компилятора.
kotlin {
targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
binaries.all {
freeCompilerArgs += "-Xadd-light-debug={enable|disable}"
}
}
}
kotlin {
targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
binaries.all {
freeCompilerArgs += "-Xadd-light-debug={enable|disable}"
}
}
}
В проектах, созданных из шаблонов IntelliJ IDEA или AppCode, эти пакеты .dSYM автоматически обнаруживаются Xcode.
Сделать фреймворки статическими при использовании перестроения из bitcode
Перестроение фреймворка, созданного на Kotlin, из bitcode делает устаревшими оригинальные .dSYM. Если это выполняется локально, убедитесь, что при символизации отчетов об ошибках используется обновленный .dSYM.
Если перестройка выполняется со стороны App Store, то .dSYM перестроенного динамического фреймворка, похоже, отбрасывается и не загружается из App Store Connect. В этом случае может потребоваться сделать фреймворк статическим.
kotlin {
targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
binaries.withType<org.jetbrains.kotlin.gradle.plugin.mpp.Framework> {
isStatic = true
}
}
}
kotlin {
targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
binaries.withType(org.jetbrains.kotlin.gradle.plugin.mpp.Framework) {
isStatic = true
}
}
}
Декодирование встроенных кадров стека
Xcode, похоже, некорректно декодирует элементы стека вызовов встроенных функций (эти функции не только Kotlin, но также функции, встроенные при оптимизации машинного кода). Поэтому некоторые элементы стека могут отсутствовать. В этом случае рассмотрите возможность использования lldb для обработки отчета об ошибке, уже просимволизированного Xcode, например:
$ lldb -b -o "script import lldb.macosx" -o "crashlog file.crash"
Эта команда должна вывести отчет об ошибке, дополнительно обработанный и включающий встроенные элементы стека.
Дополнительные сведения можно найти в документации LLDB.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-ios-symbolication.html