Всем привет!

В рамках программы Google Summer of Code 2023 мы с моим студентом разработали плагин для Intellij IDEA, который является аналогом Parallel Stacks из Visual Studio, CLion и Rider для Kotlin coroutines. Плагин анализирует стек трейсы каждой корутины в приложении и строит граф, объединяя общие наборы стек фреймов в вершины. Таким образом, во время отладки вашего приложения вы можете проанализировать
потоки выполнения всех корутин в вашей программе.

Пример работы плагина

Чтобы понять, как плагин работает, рассмотрим следующий пример:

import kotlinx.coroutines.*

fun main() = runBlocking<Unit> {
    launch {
        withContext(Dispatchers.Default) {
            println()
            delay(1000)
        }
    }

    launch {
        withContext(Dispatchers.Default) {
            println() // Поставьте брейкпоинт здесь!
            delay(1000)
        }
    }
}

Остановившись на брейкпоинте и открыв панель Coroutine Stacks, вы увидите следующий граф:

Внимательно взглянув на него, становится ясно, что в приложении есть 2 корутины. Обе они начинают свое выполнение с функции run класса CoroutineScheduler$Worker, но после функции runSafely их потоки выполнения разделяются. Стек трейс корутины, в которой был поставлен брейкпоинт, обведен синим цветом. Ее исполнение приостановлено на функции invokeSuspend и на данный момент находится на 13 строчке файла Main.kt. Вторая корутина приостановлена на функции newLine, которая была вызвана в ходе исполнения println.

Стек фреймы, которые являются библиотечными, выделены желтым цветом. Их можно отключить, нажав кнопку фильтр в левом верхнем углу панели:

Все корутины группируются по их диспатчеру, который можно выбрать нажав на drop down list в верху панели. Вы также можете кликать на стек фреймы, чтобы открыть соответствующий файл и строчку, где функция была вызвана. С полным описанием функционала плагина можно ознакомиться здесь.

Заключение

Плагин выложен в JetBrains Marketplace и его можно установить из меню Plugins в Intellij IDEA. Исходный код плагина открыт и выложен на гитхаб. Если вы столкнетесь с багами или у вас есть идея как плагин можно улучшить, обязательно откройте issue в нашем трекере!

Комментарии (4)


  1. max-zhilin
    07.01.2024 20:36
    +1

    Неплохо, но было бы интересно увидеть конкретный кейс отладки этим плагином. Типичное его применение.


  1. Yan_vas
    07.01.2024 20:36

    Отличная статья, интересный опыт, спасибо :)


  1. Newbilius
    07.01.2024 20:36
    +1

    Выглядит интересно! Скажите, а не планируете добавить совместимость с Android Studio Hedgehog | 2023.1.1? По идее это ведь та же IntelliJ IDEA.


    1. nikitanazarov Автор
      07.01.2024 20:36

      Здравствуйте! К сожалению, плагин не будет работать в Android Studio по техническим причинам, поэтому мы намеренно сделали его несовместимым с этой IDE.

      Дело в том, что для сбора информации о корутинах (их состояния, стек трейсов и др.) к VM прикрепляется Java агент, который имплементирует пустые библиотечные методы, вызываемые во время смены состояния корутин. Эти методы и логируют всю нужную информацию. К ART VM, которая используется на андройде, Java агента подключать нельзя. По этой же причине в Android Studio не работает корутиновая панель. В Google были попытки реимплементировать этого агента с помощью JVMTI, но, к сожалению, это так и не попало в продакшн.