如何调试 Gradle build.gradle 文件(在调试器中,带断点)?

How to debug a Gradle build.gradle file (in a debugger, with breakpoints)?

是否有一种工具可以让我在 build.gradle 文件中设置断点并在调试器中单步执行任务?

注意:我相信我问的问题与关于调试 Gradle 插件的类似 Whosebug 问题不同,其中(大概)的目的是通过自定义 Groovy 或 Java 插件代码位于一个单独的文件中。我想在一个简单的 build.gradle 文件中的 Gradle 任务中设置断点,例如...

task example {
   println "I want to set a breakpoint here"
}

...所以当我 运行 gradle example 我可以在调试器中检查上下文。

(对于那些会向我指出 IntelliJ 的人...尽管 JetBrains 的网站宣传他们支持在 IDEA UI 中调试 Gradle 脚本,AFAICT 这是不真实的,因为据报道这是损坏的在 IDEA13 EAP 中,在 IDEA14 中尚未修复。参见 Debugging Gradle build files in Intellij / Android Studio )

是否有任何调试工具允许我在 build.gradle 文件中设置断点,或者 Gradle DSL 中是否有一些东西使得在这样的任务中设置断点根本不可能作为我上面的例子?

我个人在需要调试构建脚本时会这样做:

在你的终端里做

export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

然后运行你的构建

gradle clean install

最后放置一些断点并在端口 5005 上的 IDE 中启动远程调试配置,一切顺利!

有更简单的方法:

只需在命令行中添加 -Dorg.gradle.debug=true --no-daemon

例如: gradle nameOfTask -Dorg.gradle.debug=true --no-daemon

然后你应该开始你的 IDE 和 运行 使用本地主机端口 5005 的远程调试,仅此而已。

Gradle 等着你,因为标准选项 server=y

org.gradle.debug

当设置为true时,Gradle将运行启用远程调试的构建,侦听端口5005。注意这相当于在JVM命令中添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005行并将挂起虚拟机,直到附加调试器。

Link to docs

IntelliJ 2018.2 添加了调试 Gradle 脚本的功能,其方式与您可能 run/debug 其他项目的方式类似。您可以在发行说明 here.

中查看公告

以下是 2018.2 部分文档的屏幕截图:

它还不支持 kotlin-dsl(参见 gradle/kotlin-dsl/issues/39)。

阅读此处的各种答案后,以下步骤将帮助您调试 build.gradle 以能够中断和调查任何自定义任务中的变量。我正在使用 Eclipse 远程调试工具

  1. 将这个简单的代码放在你想要中断的地方:try {throw new RuntimeException('Break');} catch (RuntimeException e) {}
  2. 按照建议,在命令提示符中使用 gradle mytask -Dorg.gradle.debug=true --no-daemon 开始您的任务(不必在 Eclipse 中执行)
  3. 在 Eclipse 中执行 Run -> Add Java Exception Breakpoint,选择 RuntimeException 并单击 "OK"
  4. 再次在 Eclipse 中转到 Run -> Debug Configurations -> Remote Java Application 并创建侦听 localhost:5005 的新配置。随意命名。 Select 一个包含您正在调试的 build.gradle 的项目。单击 ApplyDebug
  5. 此时执行将开始,但会在异常抛出行处暂停。然后您可以开始在“调试 -> 变量”视图中查看您的变量,检查堆栈跟踪,单步执行代码等。
  6. 没什么神奇的,唉,你不会在 build.gradle 中看到任何突出显示的内容,但你几乎可以猜到你在哪里
  7. 显然在后续运行中您不需要第 3 步,在第 4 步中您可以重复使用之前创建的配置
  8. 如果你想在多个地方使用它,只需创建一个方法,使用不同类型的异常,并随意以任何可能的方式增强这个想法

例如:

void halt() {
    try {
        throw new RuntimeException('Break');
    } catch (RuntimeException e) {
        print('Paused')
    }
}

task iterateDeclaredDependencies {
    doLast {        
        Object configs = configurations.all
        halt();
        print(configs)
    }
}

export GRADLE_OPTS 对我不起作用。

试试这个:

1 添加远程调试配置

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

2 在gradle

中添加断点

3 ./gradlew your task --stacktrace -Dorg.gradle.daemon=false -Dorg.gradle.debug=true

4 在工作室中附加调试 单击图标

然后断点停止!!

如果控制台不可用,请在工作室的调试面板中单击此选项。