Coroutine Stacks — плагин для отладки корутин Kotlin

bc79dbfbaf1b61ce509f0cf70a8f689a.png

Всем привет!

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

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

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

import kotlinx.coroutines.*

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

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

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

22688d10563e9a15a547dc64a352be62.png

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

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

84536739fd671b77c7dc67db1c9e4e8c.png

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

Заключение

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

© Habrahabr.ru