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命令行,并将挂起虚拟机,直到连接了调试器。
链接到文档
-
docs.gradle.org/current/userguide/build_environment.html上的文档以及github.com/gradle/gradle/blob/master/subprojects/core/src/ma in /中的代码表明,是的,这基本上等同于@ baptiste-mesta提供的答案。
-
我的gradle构建不会停止并等待调试器挂接?
-
gradle应该停止并等待调试器,您能告诉我cmd吗?
-
-Dorg.gradle.debug=true在我第一次运行gradle(v3.5)时有效,但第二次不起作用。 gradle守护程序似乎存在问题。因此,请尝试运行gradle build -Dorg.gradle.debug=true --no-daemon,这每次都对我有效。
-
@ neu242我总是得到输出To honour the JVM settings for this build a new JVM will be forked。你不是吗我尝试了gradle 4.0和4.5.1。
-
答案是在gradle 3.4时写的。我不开心,那个摇篮是不相容的
IntelliJ 2018.2添加了以类似于运行/调试其他项目的方式来调试Gradle脚本的功能。您可以在此处的发行说明中看到公告。
这是2018.2中一些文档的屏幕截图:
它尚不支持kotlin-dsl(请参阅gradle / kotlin-dsl / issues / 39)。
我需要调试构建脚本时会这样做:
在你的终端里面做
1
| export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" |
然后运行您的构建
最后,放置一些断点,并在端口5005上的IDE中启动远程调试配置,一切顺利!
-
当我尝试这样做时,android studio一直告诉我以下错误:无法打开调试器端口(localhost:5005):java.net.ConnectException"拒绝连接"
-
当您运行gradle clean install时,构建是否会停止在"侦听地址为5005的传输dt_socket"上
-
OP询问"是否有任何调试工具可让我在build.gradle文件中设置断点",因此可以扩展"放置一些断点"吗?
-
没错,它不能直接在build.gradle文件中用于断点。我当时在想,因为我的源代码中有我想调试的插件。但是,您可以在所需的配置阶段将中断点放在org.gradle.api.internal.project.AbstractProject中。例如让您在org.gradle.api.internal.project.AbstractProject#dependencies(Closure configClosure)上设置断点,以在调用关闭特权{...}之前停止jvm
-
AndroidStudio / Idea已连接到端口,但不会在断点处停止。 bp带有X标记显示。我猜jetbrains只是无法确定哪个源链接到哪个文件
-
launch the remote debug configuration inside your IDE是什么意思?你是怎样做的?
-
请参阅此处以了解intellij的想法:jetbrains.com/help/idea/
-
以后如何删除该选项?
-
export命令只会影响当前的Shell会话。只需打开一个新外壳即可"删除"该选项
export GRADLE_OPTS对我不起作用。
试试这个:
1添加远程调试配置
2在gradle中添加断点
3 ./gradlew your task --stacktrace -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
4在Studio中附加调试
然后,断点停止!
在阅读完各种答案之后,以下步骤将帮助您调试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的项目。单击Apply和Debug
此时,执行将开始,但将在抛出异常的行处暂停。然后,您可以开始在"调试->变量"视图中查看变量,检查堆栈跟踪,逐步执行代码等。
没什么魔术,,,您不会在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)
}
} |