【问题标题】:How to step through suspend function calls when debugging Kotlin coroutines调试 Kotlin 协程时如何单步执行挂起函数调用
【发布时间】:2019-09-09 21:16:36
【问题描述】:

如何在进入或退出“暂停”函数时调试 Kotlin 代码? (见下面的例子)。

fun mainFunction() = runBlocking {

    println("before suspend call")

    anotherFunction()

    println("after suspend call")
}

suspend fun anotherFunction() {
    // do something
}

我知道 Kotlin 协程在执行挂起函数时会发挥很大的作用,并且执行时可能会切换线程。因此,当退出“anotherFunction()”时,我只能单步执行协程框架代码,无法返回“mainFunction()”。

但是,我想知道是否可以像不涉及协程一样进行调试。是否有启用此功能的工具或库?它可能在协同例程支持的路线图上吗?

像禁用协程魔法的编译器标志这样简单的功能已经有很长的路要走,但我找不到任何东西。

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

【问题讨论】:

  • 你好。一般来说,你是对的——目前很难调试协程代码。我们正朝着这个方向积极努力,例如在 Kotlin 1.3.30 中,我们提供了异步堆栈跟踪支持:blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released 我未能在这个特定示例中重现问题(Gradle 项目,IDEA 2019.2 EAP + Kotlin 1.3.40-eap -32):从anotherFunction“跳出”直接到main。如果它仍然不适合您,请在kotl.in/issue 提出问题并附上示例代码以进行重现。谢谢。

标签: debugging kotlin kotlin-coroutines


【解决方案1】:

-Dkotlinx.coroutines.debug 虚拟机选项

这个模块提供了一个调试 JVM 代理,允许跟踪和跟踪现有的协程。

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

【讨论】:

    【解决方案2】:

    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 扩展。 https://github.com/asarkar/coroutines-test

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 2019-05-30
      • 1970-01-01
      • 2018-09-16
      • 2022-01-22
      • 1970-01-01
      • 2019-10-10
      • 2020-06-27
      • 2018-06-16
      相关资源
      最近更新 更多