如何在进入或退出“挂起”函数时调试Kotlin代码?(请参见下面的示例)。
fun mainFunction() = runBlocking {
println("before suspend call")
anotherFunction()
println("after suspend call")
}
suspend fun anotherFunction() {
// do something
}
我知道Kotlin协同例程在执行挂起函数时做了很多神奇的事情,而且在那一刻执行可能会切换线程。因此,当我走出"anotherFunction()“时,我只能单步执行协程框架代码,而不能返回到"mainFunction()”。
但是,我想知道是否可以像不涉及协同例程一样对此进行调试。是否有工具或库可以启用此功能?它可能在协同支持的路线图上吗?
一个像编译器标志禁用协同例程魔法这样简单的功能已经很有用了,但我什么也找不到。
我发现的唯一有用的事情是: kotlin JVM参数还激活了-ea调试模式,该模式将至少“修复”异常的堆栈跟踪。
发布于 2020-08-08 04:47:41
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和更高版本支持从集成开发环境内部调试协程,但就像所有来自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
发布于 2020-07-27 02:12:26
-Dkotlinx.coroutines.debug
VM选项
该模块提供了一个调试JVM代理,允许跟踪和跟踪现有的协程。
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-debug/
https://stackoverflow.com/questions/55764586
复制相似问题