在IDEA中调试Kotlin协程时如何查看局部变量值?

Nik*_*kel 8 intellij-idea kotlin kotlin-coroutines

当调试器在 Kotlin 协程代码中的某个断点处停止时,我通常会遇到无法访问局部变量值的问题(由于协程实现的性质,它们超出了范围并且无法访问)。

是否有任何编译器参数或 IDEA 技巧可以保持局部变量在挂起点上可见?

显示变量示例的图像已优化解决问题

aks*_*618 2

TL;DR:使用-Xdebug(注意d是小写)编译器选项,但确保它不在生产中使用

此问题的原因和之前的解决方法已在相应问题的评论中得到很好的解释。简而言之,保留变量在某些特定情况下可能会导致内存泄漏,因此决定在不使用它们时立即清理它们。

没有解决方法的内存泄漏的严重性远高于使用解决方法的糟糕的可调试性。...不幸的是,没有办法保存变量的值并避免内存泄漏。因此,解决方案将出现在某种编译器开关中,这会禁用错误修复。

Kotlin 1.8添加了-Xdebug这个确切的编译器选项:

在 Maven 中启用此功能的示例(更好的方法可能是使用 Maven 配置文件来确保在产品中不使用此功能):

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <configuration>
        <args>
            <!--  Disables "x was optimized out" behaviour while debugging coroutines. Do NOT use in prod! -->
            <arg>-Xdebug</arg>
        </args>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

由于这本质上禁用了对可能的内存泄漏的修复,因此不应在生产中使用。正如官方文档警告的那样:

切勿在生产中使用此标志:-Xdebug 可能导致内存泄漏