Всем привет!
В рамках программы 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 в нашем трекере!