调试Kotlin协程时如何逐步执行暂停功能调用

时间:2019-04-19 16:02:13

标签: debugging kotlin kotlin-coroutines

进入或退出“暂停”功能时,如何调试Kotlin代码? (请参见下面的示例)。

fun mainFunction() = runBlocking {

    println("before suspend call")

    anotherFunction()

    println("after suspend call")
}

suspend fun anotherFunction() {
    // do something
}

我知道Kotlin协同例程在执行挂起函数时会发挥很多魔力,并且那时执行可能会切换线程。因此,当退出“ anotherFunction()”时,我只能遍历协程框架代码,而无法回到“ mainFunction()”。

但是,我想知道是否有可能像没有参与协程那样调试它。是否有启用此功能的工具或库?可能在共同例程支持的路线图上吗?

像编译器标志这样的简单功能禁用了协同例程魔术功能已经走了很长一段路,但是我什么也找不到。

我发现的唯一有用的东西是:-ea JVM参数还激活了kotlin调试模式,该模式将至少“修复”堆栈跟踪中的异常。

2 个答案:

答案 0 :(得分:1)

-Dkotlinx.coroutines.debug VM选项

此模块提供了一个调试JVM代理,该代理可以跟踪和跟踪现有的协程。

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/

答案 1 :(得分:1)

This页显示了一些常规技术。简而言之,请使用已启用的断言(-ea JVM标志)运行。

kotlinx-coroutines-debug模块是专门为其名称说明的。这就是我在单元测试中使用它的方式;

runBlocking {
    DebugProbes.install()
    val deferred = async { methodUnderTest() }
    delay(3000)
    DebugProbes.dumpCoroutines()
    println("\nDumping only deferred")
    DebugProbes.printJob(deferred)
    DebugProbes.uninstall()
    cleanup()
}

有一个JUnit4规则可以减少样板,但是您不应该在2020年末使用JUnit4。

此外,Kotlin 1.4.0-RC和更高版本还支持从IDE内部调试协同程序,但是就像JetBrains的所有新功能一样,我发现它半生不熟,并且并不总是显示暂停的协同程序。 kotlinx-coroutines-debug的效果更好。 https://blog.jetbrains.com/kotlin/2020/07/kotlin-1-4-rc-debugging-coroutines/

编辑2020年10月:

我创建了一个JUnit 5 Extension,可以在超时时转储协程。 https://github.com/asarkar/coroutines-test

相关问题