当我尝试以intelliJ的调试模式构建多项目时,我将以无限构建结尾,这意味着某些线程(执行工作者)将在无限时间内执行它们。
首先,我调查了Thread dump。我看到以无限状态结尾的每个线程都具有相同的堆栈跟踪:
"Execution worker for ':' Thread 5" #51 prio=5 os_prio=0 tid=0x000000002918e800 nid=0x4104 runnable [0x000000002e93c000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:224)
at com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper.send(ForkedDebuggerHelper.java:48)
at com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper.setupDebugger(ForkedDebuggerHelper.java:24)
at com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper$setupDebugger$0.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
...
我还看到,只有Test
或JavaExec
类型的Tasks受到影响。总体而言,类型为JavaForkOptions
的所有任务。而且我看到,我 didnt 从IntelliJ获得了这些线程的以下消息,这些消息最终处于无限状态:
已连接到由':my-project:geb:test'(localhost:61041)启动的VM。打开调试器会话标签
(例如)。
哪个任务将以无限状态结束是不确定的,因此当我使用属性org.gradle.parallel=false
构建整个gradle构建时,构建将成功完成。当我在没有调试模式的情况下运行此构建时,一切正常。
我应该提到,对于这些无限状态线程,也不会执行此gradle脚本代码:
gradle.taskGraph.beforeTask { Task task ->
if (task instanceof JavaForkOptions) {
print('JvmArgs For Forking' + task.jvmArgs + ' -- in Task ' + task.getName() + '\n')
}
}
我将Java 8更新为java8_211,并尝试将gradle从5.4.1降级到4.10.3,但是它也不起作用。
编辑:我向JetBrains报告了此问题,他们已经有票了。 https://youtrack.jetbrains.com/issue/IDEA-207748