首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在调试Kotlin协程时单步执行挂起函数调用

如何在调试Kotlin协程时单步执行挂起函数调用
EN

Stack Overflow用户
提问于 2019-04-20 00:02:13
回答 2查看 7.9K关注 0票数 41

如何在进入或退出“挂起”函数时调试Kotlin代码?(请参见下面的示例)。

代码语言:javascript
运行
复制
fun mainFunction() = runBlocking {

    println("before suspend call")

    anotherFunction()

    println("after suspend call")
}

suspend fun anotherFunction() {
    // do something
}

我知道Kotlin协同例程在执行挂起函数时做了很多神奇的事情,而且在那一刻执行可能会切换线程。因此,当我走出"anotherFunction()“时,我只能单步执行协程框架代码,而不能返回到"mainFunction()”。

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

一个像编译器标志禁用协同例程魔法这样简单的功能已经很有用了,但我什么也找不到。

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

EN

回答 2

Stack Overflow用户

发布于 2020-08-08 04:47:41

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

kotlinx-coroutines-debug模块是专门为其名称所表达的内容而设计的。这就是我在单元测试中使用它的方式;

代码语言:javascript
运行
复制
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和更高版本支持从集成开发环境内部调试协程,但就像所有来自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

票数 5
EN

Stack Overflow用户

发布于 2020-07-27 02:12:26

-Dkotlinx.coroutines.debug VM选项

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55764586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档