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() ブロックを使用します。
    • 遅延値 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()}")
    }
  3. 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 コンパイラオプションを使用して無効にできます。

DANGER

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