LoginSignup
4
3

Kotlinコンパイルで出たe: Could not load module <Error module>をKotlinコンパイラをデバッグして解決するメモ

Posted at

原因

基本的には存在しないクラスを参照していたりして起きています。
なので、Android Studioでそのクラスを開ければ赤くエラーが出ているので解決します。

何もソースコードの位置が出ないので、だいぶ解決が難しいです。
多すぎたりしてクラスを特定するのが難しい場合もあります。

デバッグ方法

事前準備

Kotlinが別のプロセスで動いているとGradleの仕組みでデバッグできないのでプロセス内で動かす必要があります。

-Dkotlin.compiler.execution.strategy="in-process"

でin processでビルドできるはずなんですが、できない(デーモンでの起動になってしまう)ので、以下をgradle.propertiesに書きます。

kotlin.compiler.execution.strategy=in-process

デバッグ待ち状態にする

以下は:app:kaptGenerateStubsDebugKotlinでエラーが出ている場合です。:app:compileKotlinとかの場合もあります。

./gradlew --no-daemon :app:kaptGenerateStubsDebugKotlin --no-daemon -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy="in-process" -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"

こんな感じのタスクを動かして、Gradleをデバッガー接続待ち状態にします。

デバッガー付きでタスクを動かす

Remote JVM DebugのconfigurationをAndroid Studioから作って起動するとコンパイラにデバッガーを貼ったときに、ちゃんとと止まるようになります。

image.png

コンパイラのクラスがIDE上から見れない場合

"Use module classpass"に指定しているモジュールのbuild.gradleでdependenciesにcompileOnlyなどでデバッグ上で必要になる依存を追加してあげましょう。これでSyncしてあげればそのコードが見れます。バージョンがズレていると、コードの位置が違うため、うまくデバッグできないと思います。
自分がやったときにはK2JVMCompilerなどがKotlinのコンパイラでした。

  compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:...")
  compileOnly("org.jetbrains.kotlin:kotlin-reflect:...")

解決

後はエラーメッセージを生成しているクラスのコンストラクタを呼び出している部分を探して、デバッガーをつけたりして、原因の特定を頑張るだけです。

私の場合はSymbolTableSliceというクラスのreferenced()関数で新しいSymbolが追加されるタイミングで、new.descriptor is ErrorFunctionDescriptor || new.descriptor is ErrorModuleDescriptor というConditionを設定したデバッガーを書くことで参照元のクラスを発見することができ、解決しました。 (ここまでたどり着くのが長かった)

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3