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 の手順を参照してください。

  3. src/main/kotlin 内の Main.kt ファイルを開きます。

    src ディレクトリには Kotlin ソースファイルとリソースが含まれています。Main.kt ファイルには、Hello World! を出力するサンプルコードが含まれています。

  4. main() 関数のコードを変更します。

    • コルーチンをラップするために、runBlocking() ブロックを使用します。
    • 遅延値 ab を計算するコルーチンを作成するために、async() 関数を使用します。
    • 計算結果を待機するために、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()}")
    }
  5. Build Project をクリックしてコードをビルドします。

    アプリケーションをビルドする

コルーチンのデバッグ

  1. println() 関数呼び出しのある行にブレークポイントを設定します。

    コンソールアプリケーションをビルドする

  2. 画面上部の実行構成の横にある Debug をクリックして、デバッグモードでコードを実行します。

    コンソールアプリケーションをビルドする

    Debug ツールウィンドウが表示されます。

    • Frames タブには、コールスタックが含まれています。
    • Variables タブには、現在のコンテキストの変数が含まれています。
    • Coroutines タブには、実行中または中断中のコルーチンに関する情報が含まれています。ここには3つのコルーチンが表示されています。 最初のコルーチンは RUNNING ステータスで、他の2つは CREATED ステータスです。

    コルーチンをデバッグする

  3. Debug ツールウィンドウで Resume Program をクリックしてデバッガーセッションを再開します。

    コルーチンをデバッグする

    現在、Coroutines タブには次のように表示されます。

    • 最初のコルーチンは SUSPENDED ステータスです – 値を乗算するために待機しています。
    • 2番目のコルーチンは a の値を計算しており、RUNNING ステータスです。
    • 3番目のコルーチンは CREATED ステータスで、b の値は計算していません。
  4. Debug ツールウィンドウで Resume Program をクリックしてデバッガーセッションを再開します。

    コンソールアプリケーションをビルドする

    現在、Coroutines タブには次のように表示されます。

    • 最初のコルーチンは SUSPENDED ステータスです – 値を乗算するために待機しています。
    • 2番目のコルーチンは値を計算し終え、表示されなくなりました。
    • 3番目のコルーチンは b の値を計算しており、RUNNING ステータスです。

IntelliJ IDEA デバッガーを使用すると、各コルーチンを深く掘り下げてコードをデバッグできます。

最適化によって除外された変数

suspend 関数を使用している場合、デバッガーで変数の名前の横に「was optimized out」というテキストが表示されることがあります。

変数 "a" は最適化により除外されました

このテキストは、変数の寿命が短縮され、変数がもはや存在しないことを意味します。 最適化された変数を含むコードは、その値が見えないためデバッグが困難です。 この動作は、-Xdebug コンパイラオプションで無効にできます。

本番環境でこのフラグを絶対に使用しないでください: -Xdebugメモリリークを引き起こす可能性があります