IntelliJ IDEA を使ってコルーチンをデバッグする – チュートリアル
このチュートリアルでは、Kotlin コルーチンの作成方法と、IntelliJ IDEA を使ってデバッグする方法を説明します。
このチュートリアルは、「コルーチン」の概念について既にご存知であることを前提としています。
コルーチンの作成
IntelliJ IDEA で Kotlin プロジェクトを開きます。プロジェクトがない場合は、作成してください。
Gradle プロジェクトで
kotlinx.coroutines
ライブラリを使用するには、build.gradle(.kts)
に次の依存関係を追加します。
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
}
dependencies {
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()
ブロックを使用します。 - 遅延値
a
とb
を計算するコルーチンを作成するには、async()
関数を使用します。 - 計算結果を待機するには、
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 タブには、実行中または中断されたコルーチンに関する情報が含まれています。ここには3つのコルーチンがあることが示されています。 最初のコルーチンは 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 のデバッガーを使用すると、各コルーチンをより深く掘り下げてコードをデバッグできます。
最適化によって除去された変数
suspend
関数を使用すると、デバッガーで、変数の名前の横に「was optimized out」というテキストが表示される場合があります。
このテキストは、変数のライフタイムが短縮され、その変数はもう存在しないことを意味します。 最適化された変数を含むコードをデバッグすることは、その値が表示されないため困難です。 この動作は、-Xdebug
コンパイラオプションを使用して無効にできます。
DANGER
このフラグを本番環境で使用しないでください:-Xdebug
はメモリリークを引き起こす可能性があります。