8

我正在构建一个注释处理器,我最近使用 kotlin-kapt 插件从使用默认的 annotationProcessor 类型切换到 kapt。

我正在使用命令调试我的处理器

./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac

(此处的完整说明:https ://stackoverflow.com/a/42488641/502463 )

然后运行远程调试配置。当我使用 annotationProcessor 时,我可以打断点,并且调试得很好。使用 kapt,我的处理器运行,但我无法调试它。没有触发断点。

我的 kotlin 版本是 1.1.2-3

4

4 回答 4

11

您实际上想要调试 Kotlin 编译器守护程序,而不是 Gradle 守护程序。以下是传递所需 JVM 参数的方法:

./gradlew <tasks> -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"
于 2017-05-22T18:28:07.317 回答
3

我刚刚尝试调试 Kotlin 注释处理器并找到了这篇文章。您可以通过传递 suspend=y 告诉 JVM 等待调试器

我现在做的是从命令行开始构建:

./gradlew --no-daemon clean build -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=y"

然后通过远程配置与 Intellij 连接。

于 2019-06-15T13:51:51.847 回答
2

另一个答案通常是正确的,但我发现https://medium.com/@daptronic/annotation-processing-with-kapt-and-gradle-237793f2be57有助于了解更多细节。

你可以运行这样的东西

./gradlew --no-daemon clean compileDebugKotlin -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

或者如果你想运行一个特定的模块

./gradlew --no-daemon :modulename:clean :modulename:compileDebugKotlin -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

棘手的部分

在附加调试器之前,我们实际上需要等待 Kotlin 编译任务开始,它不会像 java 那样暂停并等待您附加调试器。

所以你想监控你的构建并寻找任务: :app:kaptDebugKotlin 当你看到它时,立即前往你的 IDE 并在你的远程配置上点击调试。如果您不及时附加,任务将继续进行。你有几秒钟的时间来弄清楚它,但要让它全部工作起来有点竞争。

这让我花了很长时间才弄清楚并开始工作。现在,只要我运行命令,我就去 IDE 并混合调试器按钮,我很幸运能够以这种方式附加它。

于 2017-09-24T00:35:40.543 回答
2

从 Kotlin 1.2.60 开始,kapt 通过包含kapt.use.worker.api=true在您的 gradle.properties 文件中来支持使用 Gradle Worker API。

额外的副作用是 kapt 任务可以使用普通的 gradle 调试参数 ( ./gradlew <task> -Dorg.gradle.debug=true --no-daemon) 进行调试,并且不需要特定的 kotlin 参数。

于 2019-11-19T22:06:11.800 回答