Spec-Zone.ru › Kotlin 2

Отладка Kotlin/Native

Компилятор Kotlin/Native может генерировать бинарные файлы с отладочной информацией, а также создавать файлы отладочных символов для символизации отчетов о сбоях.

Отладочная информация совместима со спецификацией DWARF 2, поэтому современные отладчики, такие как LLDB и GDB, могут:

  • Устанавливать точки останова

  • Выполнять пошаговую отладку

  • Просматривать информацию о переменных и типах

Поддержка спецификации DWARF 2 означает, что отладчик распознает Kotlin как C89, поскольку до появления спецификации DWARF 5 в ней не было идентификатора для типа языка Kotlin.

Генерация бинарных файлов с отладочной информацией

При отладке в IntelliJ IDEA, Android Studio или Xcode бинарные файлы с отладочной информацией генерируются автоматически (если конфигурация сборки не задает иное).

Отладку можно включить вручную и создать бинарные файлы с отладочной информацией следующими способами:

  • С помощью задач Gradle. Чтобы получить отладочные бинарные файлы, используйте задачи Gradle linkDebug*, например:

    ./gradlew linkDebugFrameworkNative
    

    Задачи различаются в зависимости от типа бинарного файла (например, linkDebugSharedNative) или целевой платформы (например, linkDebugExecutableMacosArm64).

  • С помощью компилятора командной строки. Скомпилируйте бинарный файл Kotlin/Native в командной строке с параметром -g:

    kotlinc-native hello.kt -g -o terminator
    

Затем запустите отладчик. Например:

lldb terminator.kexe

Отладчик выводит:

$ cat - > hello.kt
fun main(args: Array<String>) {
  println("Hello world")
  println("I need your clothes, your boots and your motorcycle")
}
$ dist/bin/konanc -g hello.kt -o terminator
KtFile: hello.kt
$ lldb terminator.kexe
(lldb) target create "terminator.kexe"
Current executable set to 'terminator.kexe' (x86_64).
(lldb) b kfun:main(kotlin.Array<kotlin.String>)
Breakpoint 1: where = terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) + 4 at hello.kt:2, address = 0x00000001000012e4
(lldb) r
Process 28473 launched: '/Users/minamoto/ws/.git-trees/debugger-fixes/terminator.kexe' (x86_64)
Process 28473 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00000001000012e4 terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) at hello.kt:2
   1    fun main(args: Array<String>) {
-> 2      println("Hello world")
   3      println("I need your clothes, your boots and your motorcycle")
   4    }
(lldb) n
Hello world
Process 28473 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
    frame #0: 0x00000001000012f0 terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) at hello.kt:3
   1    fun main(args: Array<String>) {
   2      println("Hello world")
-> 3      println("I need your clothes, your boots and your motorcycle")
   4    }
(lldb)

Установка точек останова

Современные отладчики позволяют устанавливать точки останова несколькими способами. Ниже приведен обзор команд для каждого инструмента:

LLDB

  • По имени:

    (lldb) b -n kfun:main(kotlin.Array<kotlin.String>)
    Breakpoint 4: where = terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) + 4 at hello.kt:2, address = 0x00000001000012e4
    

    -n — необязательный параметр, он используется по умолчанию.

  • По расположению (имя файла, номер строки):

    (lldb) b -f hello.kt -l 1
    Breakpoint 1: where = terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) + 4 at hello.kt:2, address = 0x00000001000012e4
    
  • По адресу:

    (lldb) b -a 0x00000001000012e4
    Breakpoint 2: address = 0x00000001000012e4
    
  • По регулярному выражению. Это может быть полезно при отладке сгенерированных артефактов, например лямбды (в имени которой есть символ #):

    (lldb) b -r main\(
    3: regex = 'main\(', locations = 1
      3.1: where = terminator.kexe`kfun:main(kotlin.Array<kotlin.String>) + 4 at hello.kt:2, address = terminator.kexe[0x00000001000012e4], unresolved, hit count = 0
    

GDB

  • По регулярному выражению:

    (gdb) rbreak main(
    Breakpoint 1 at 0x1000109b4
    struct ktype:kotlin.Unit &kfun:main(kotlin.Array<kotlin.String>);
    
  • Установка по имени невозможна, потому что : используется как разделитель при установке точки останова по расположению:

    (gdb) b kfun:main(kotlin.Array<kotlin.String>)
    No source file named kfun.
    Make breakpoint pending on future shared library load? (y or [n]) y
    Breakpoint 1 (kfun:main(kotlin.Array<kotlin.String>)) pending
    
  • По расположению:

    (gdb) b hello.kt:1
    Breakpoint 2 at 0x100001704: file /Users/minamoto/ws/.git-trees/hello.kt, line 1.
    
  • По адресу:

    (gdb) b *0x100001704
    Note: breakpoint 2 also set at pc 0x100001704.
    Breakpoint 3 at 0x100001704: file /Users/minamoto/ws/.git-trees/hello.kt, line 2.
    

Пошаговая отладка

Пошаговое выполнение функций в основном работает так же, как и для программ на C/C++.

Просмотр переменных

Просмотр переменных var работает без дополнительной настройки как для примитивных, так и для непримитивных типов:

$ cat -n main.kt
     1  fun main(args: Array<String>) {
     2      var x = 1
     3      var y = 2
     4      var p = Point(x, y)
     5      println("p = $p")
     6  }
     7 
     8  data class Point(val x: Int, val y: Int)

$ lldb ./program.kexe -o 'b main.kt:5' -o
(lldb) target create "./program.kexe"
Current executable set to './program.kexe' (x86_64).
(lldb) b main.kt:5
Breakpoint 1: where = program.kexe`kfun:main(kotlin.Array<kotlin.String>) + 289 at main.kt:5
(lldb) r
Process 4985 stopped
* thread #1, name = 'program.kexe', stop reason = breakpoint 1.1
    frame #0: program.kexe`kfun:main(kotlin.Array<kotlin.String>) at main.kt:5
   2        var x = 1
   3        var y = 2
   4        var p = Point(x, y)
-> 5        println("p = $p")
   6    }
   7   
   8    data class Point(val x: Int, val y: Int)

Process 4985 launched: './program.kexe' (x86_64)
(lldb) fr var
(int) x = 1
(int) y = 2
(ObjHeader *) p = Point(x=1, y=2)

(lldb) v p->x
(int32_t) p->x = 1

Отладка приложений iOS

Отладка приложений iOS иногда включает подробный анализ отчетов о сбоях. Для работы с отчетами о сбоях обычно требуется символизация — преобразование адресов памяти в понятные расположения исходного кода.

Чтобы символизировать адреса в коде Kotlin (например, элементы трассировки стека, соответствующие коду Kotlin), нужен специальный файл отладочных символов (.dSYM). Этот файл сопоставляет адреса памяти в отчетах о сбоях с фактическими расположениями в исходном коде, например функциями или номерами строк.

По умолчанию компилятор Kotlin/Native создает файлы .dSYM для релизных (оптимизированных) бинарных файлов на платформах Apple. При сборке в Xcode IDE ищет файлы .dSYM в стандартных расположениях и автоматически использует их для символизации. Xcode автоматически обнаруживает файлы .dSYM в проектах, созданных на основе шаблонов IntelliJ IDEA.

На других платформах можно добавить отладочную информацию в созданные бинарные файлы (это увеличит их размер), используя параметр компилятора -Xadd-light-debug:

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

Дополнительную информацию об отчетах о сбоях см. в документации Apple.

Известные проблемы

  • Производительность привязок Python.

  • Вычисление выражений в отладчиках не поддерживается, и в настоящее время планов по его реализации нет.

Что дальше?

Узнайте, как улучшить отчеты о сбоях, вызванных необработанными исключениями Kotlin в коде iOS

23 июля 2026 г.
Параметры бинарных файлов Kotlin/NativeПоддерживаемые целевые платформы и хосты Kotlin/Native

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/native-debugging.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API