IntelliJ IDEA を使用したコルーチンのデバッグ – チュートリアル
このチュートリアルでは、Kotlin コルーチンを作成し、IntelliJ IDEA を使用してデバッグする方法を説明します。
このチュートリアルは、コルーチンの概念に関する予備知識があることを前提としています。
コルーチンの作成
IntelliJ IDEA で Kotlin プロジェクトを開きます。プロジェクトがない場合は、作成してください。
Gradle プロジェクトで
kotlinx.coroutinesライブラリを使用するには、以下の依存関係をbuild.gradle(.kts)に追加します。kotlindependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") }groovydependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2' }その他のビルドシステムについては、
kotlinx.coroutinesの README の指示を参照してください。src/main/kotlinにあるMain.ktファイルを開きます。srcディレクトリには Kotlin のソースファイルとリソースが含まれています。Main.ktファイルには、Hello World!を出力するサンプルコードが含まれています。main()関数のコードを変更します:runBlocking()ブロックを使用して、コルーチンをラップします。async()関数を使用して、遅延値(Deferred values)aとbを計算するコルーチンを作成します。await()関数を使用して、計算結果を待機します。println()関数を使用して、計算ステータスと乗算の結果を出力に表示します。
kotlinimport 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()}") }Build Project をクリックしてコードをビルドします。

コルーチンのデバッグ
println()関数が呼び出されている行にブレークポイントを設定します:
画面上部の実行構成の横にある Debug をクリックして、デバッグモードでコードを実行します。

Debug ツールウィンドウが表示されます:
- Frames タブにはコールスタックが含まれています。
- Variables タブには現在のコンテキスト内の変数が含まれています。
- Coroutines タブには実行中または中断(suspended)されたコルーチンに関する情報が含まれています。ここでは3つのコルーチンがあることがわかります。 最初の1つは RUNNING ステータスで、他の2つは CREATED ステータスになっています。

Debug ツールウィンドウの Resume Program をクリックして、デバッガーセッションを再開します:

これで、Coroutines タブには以下が表示されます:
- 最初のコルーチンは SUSPENDED ステータスです。これは、乗算を行うために値を待機している状態です。
- 2番目のコルーチンは
aの値を計算しており、RUNNING ステータスです。 - 3番目のコルーチンは CREATED ステータスであり、まだ
bの値を計算していません。
Debug ツールウィンドウの Resume Program をクリックして、デバッガーセッションを再開します:

これで、Coroutines タブには以下が表示されます:
- 最初のコルーチンは SUSPENDED ステータスです。値を待機して乗算を行おうとしています。
- 2番目のコルーチンは値を計算し終えて消滅しました。
- 3番目のコルーチンは
bの値を計算しており、RUNNING ステータスです。
IntelliJ IDEA デバッガーを使用すると、各コルーチンをさらに深く掘り下げてコードをデバッグできます。
最適化により除外された変数 (Optimized-out variables)
suspend 関数を使用している場合、デバッガーで変数名の横に "was optimized out" というテキストが表示されることがあります。

このテキストは、変数の生存期間が短縮され、その変数がもう存在しないことを意味します。 変数が最適化されていると、その値を確認できないため、コードのデバッグが困難になります。 この挙動は、コンパイラオプションの -Xdebug を使用して無効にすることができます。
このフラグを本番環境(production)では決して使用しないでください:
-Xdebugはメモリリークを引き起こす可能性があります。
