Всем привет!
В рамках программы 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)
Newbilius
07.01.2024 20:36+1Выглядит интересно! Скажите, а не планируете добавить совместимость с Android Studio Hedgehog | 2023.1.1? По идее это ведь та же IntelliJ IDEA.
nikitanazarov Автор
07.01.2024 20:36Здравствуйте! К сожалению, плагин не будет работать в Android Studio по техническим причинам, поэтому мы намеренно сделали его несовместимым с этой IDE.
Дело в том, что для сбора информации о корутинах (их состояния, стек трейсов и др.) к VM прикрепляется Java агент, который имплементирует пустые библиотечные методы, вызываемые во время смены состояния корутин. Эти методы и логируют всю нужную информацию. К ART VM, которая используется на андройде, Java агента подключать нельзя. По этой же причине в Android Studio не работает корутиновая панель. В Google были попытки реимплементировать этого агента с помощью JVMTI, но, к сожалению, это так и не попало в продакшн.
max-zhilin
Неплохо, но было бы интересно увидеть конкретный кейс отладки этим плагином. Типичное его применение.