Skip to content

使用 IntelliJ IDEA 调试协程 – 教程

本教程演示如何创建 Kotlin 协程并使用 IntelliJ IDEA 调试它们。

本教程假定您已了解协程概念。

创建协程

  1. 在 IntelliJ IDEA 中打开一个 Kotlin 项目。如果您没有项目,请创建一个

  2. 要在 Gradle 项目中使用 kotlinx.coroutines 库,请将以下依赖项添加到 build.gradle(.kts)

kotlin
   dependencies {
       implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
   }
groovy
   dependencies {
       implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'
   }

:::

对于其他构建系统,请参阅 kotlinx.coroutines README 中的说明。

  1. 打开 src/main/kotlin 中的 Main.kt 文件。

    src 目录包含 Kotlin 源文件和资源。Main.kt 文件包含将打印 Hello World! 的示例代码。

  2. 更改 main() 函数中的代码:

    • 使用 runBlocking() 块来包裹协程。
    • 使用 async() 函数创建计算延迟值 ab 的协程。
    • 使用 await() 函数等待计算结果。
    • 使用 println() 函数将计算状态和乘法结果打印到输出。
    kotlin
    import kotlinx.coroutines.*
    
    fun main() = runBlocking<Unit> {
        val a = async {
            println("I'm computing part of the answer")
            6
        }
        val b = async {
            println("I'm computing another part of the answer")
            7
        }
        println("The answer is ${a.await() * b.await()}")
    }
  3. 点击 Build Project (构建项目) 来构建代码。

    Build an application

调试协程

  1. 在包含 println() 函数调用的行设置断点:

    Build a console application

  2. 点击屏幕顶部的运行配置旁边的 Debug (调试) 按钮,以调试模式运行代码。

    Build a console application

    Debug (调试) 工具窗口出现:

    • Tab 页 Frames (帧) 包含调用堆栈。
    • Tab 页 Variables (变量) 包含当前上下文中的变量。
    • Tab 页 Coroutines (协程) 包含有关运行中或已挂起的协程的信息。它显示有三个协程。 第一个协程处于 RUNNING (运行中) 状态,其他两个处于 CREATED (已创建) 状态。

    Debug the coroutine

  3. 点击 Debug (调试) 工具窗口中的 Resume Program (恢复程序) 来恢复调试会话:

    Debug the coroutine

    现在 Coroutines (协程) tab 页显示如下:

    • 第一个协程处于 SUSPENDED (已挂起) 状态 – 它正在等待值以便可以进行乘法运算。
    • 第二个协程正在计算 a 值 – 它处于 RUNNING (运行中) 状态。
    • 第三个协程处于 CREATED (已创建) 状态,并且未计算 b 的值。
  4. 点击 Debug (调试) 工具窗口中的 Resume Program (恢复程序) 来恢复调试会话:

    Build a console application

    现在 Coroutines (协程) tab 页显示如下:

    • 第一个协程处于 SUSPENDED (已挂起) 状态 – 它正在等待值以便可以进行乘法运算。
    • 第二个协程已计算出其值并消失了。
    • 第三个协程正在计算 b 的值 – 它处于 RUNNING (运行中) 状态。

使用 IntelliJ IDEA 调试器,您可以深入探究每个协程来调试您的代码。

优化掉的变量

如果您使用 suspend 函数,在调试器中,您可能会在变量名旁边看到“was optimized out” (已优化出) 文本:

Variable "a" was optimized out

此文本表示变量的生命周期已缩短,并且该变量不再存在。 由于您看不到变量的值,因此调试包含优化变量的代码很困难。 您可以使用 -Xdebug 编译器选项禁用此行为。

DANGER

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