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

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

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

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

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

...以便在运行gradle example时可以在调试器中检查上下文。

(对于那些将我指向IntelliJ的人来说,尽管JetBrains的网站宣称他们支持在IDEA UI中调试Gradle脚本,但AFAICT的说法不正确,因为在IDEA13 EAP中有报道说这是错误的,并且在IDEA14中尚未修复。请参见在Intellij / Android Studio中调试Gradle构建文件)

是否有任何调试工具可让我在build.gradle文件中设置断点,或者有关Gradle DSL的某些内容使从根本上无法在上述示例中的任务中设置断点?


有更简单的方法:

只需添加您的命令行-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命令行,并将挂起虚拟机,直到连接了调试器。

链接到文档


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

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

IntelliJ documentation for debugging a Gradle script task

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


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

在你的终端里面做

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

然后运行您的构建

1
gradle clean install

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


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


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

  • 将此简单代码放在要中断的位置:try {throw new RuntimeException('Break');} catch (RuntimeException e) {}
  • 根据建议,在命令提示符下使用gradle mytask -Dorg.gradle.debug=true --no-daemon启动您的任务(不必在Eclipse中执行)
  • 在Eclipse中,执行Run -> Add Java Exception Breakpoint,选择RuntimeException,然后单击"确定"。
  • 再次在Eclipse中转到Run -> Debug Configurations -> Remote Java Application并创建在localhost:5005上侦听的新配置。随便命名。选择一个包含要调试的build.gradle的项目。单击ApplyDebug
  • 此时,执行将开始,但将在抛出异常的行处暂停。然后,您可以开始在"调试->变量"视图中查看变量,检查堆栈跟踪,逐步执行代码等。
  • 没什么魔术,,,您不会在build.gradle中看到任何突出显示的内容,但是您几乎可以猜测出您的位置
  • 显然,在随后的运行中,您不需要步骤3,而在步骤4中,您可以重复使用先前创建的配置
  • 如果您想在多个地方使用此方法,只需创建一个方法,使用不同类型的异常,并随时以任何可能的方式增强此方法
  • 例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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