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

时间:2015-02-10 17:09:22

标签: debugging gradle

是否有工具允许我在build.gradle文件中设置断点并在调试器中逐步执行任务?

注意:我相信我提出的问题与关于调试Gradle插件的类似stackoverflow问题不同,其中(可能)的目的是逐步执行位于单独文件中的自定义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的内容使得从根本上不可能在上面的例子中设置断点?

5 个答案:

答案 0 :(得分:17)

有更简单的方法:

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

即可

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

然后你应该启动你的IDE并使用localhost端口5005运行远程调试。

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

<强> org.gradle.debug

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

Link to docs

答案 1 :(得分:9)

Personnaly当我需要调试构建脚本时,我会这样做:

在你的终端里面做

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

然后运行你的构建

gradle clean install

最后放置一些断点并在端口5005上的IDE中启动远程调试配置,你就可以了!

答案 2 :(得分:9)

IntelliJ 2018.2添加了以类似于您可能运行/调试其他项目的方式调试Gradle脚本的功能。您可以在发行说明here中看到该公告。

以下是2018.2中一些文档的屏幕截图:

IntelliJ documentation for debugging a Gradle script task

它尚不支持kotlin-dsl(请参阅gradle/kotlin-dsl/issues/39)。

答案 3 :(得分:1)

在阅读完各种答案之后,以下步骤将帮助您调试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,然后单击“确定”
  4. 再次在Eclipse中转到Run -> Debug Configurations -> Remote Java Application并创建在localhost:5005上侦听的新配置。随便命名。选择包含要调试的build.gradle的项目。点击ApplyDebug
  5. 这时将开始执行,但会在抛出异常的行处暂停。然后,您可以开始在“调试->变量”视图中查看变量,检查堆栈跟踪,逐步执行代码等。
  6. No,没有魔术,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)
    }
}

enter image description here

答案 4 :(得分:0)

export GRADLE_OPTS对我不起作用。

尝试一下:

1添加远程调试配置

enter image description here

2在gradle中添加断点

enter image description here

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

4在Studio中附加调试

enter image description here

然后断点就停止了!

enter image description here