Debugging 从IntelliJ调试功能测试

Debugging 从IntelliJ调试功能测试,debugging,grails,intellij-idea,remote-debugging,Debugging,Grails,Intellij Idea,Remote Debugging,我正在开发一个Grails应用程序,它有一套(Geb)功能测试。我过去能够从IntelliJ内部调试这些测试,但现在每当我尝试在调试模式下运行测试时,我都会遇到以下错误 ERROR: transport error 202: connect failed: Connection refused FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(19

我正在开发一个Grails应用程序,它有一套(Geb)功能测试。我过去能够从IntelliJ内部调试这些测试,但现在每当我尝试在调试模式下运行测试时,我都会遇到以下错误

ERROR: transport error 202: connect failed: Connection refused
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]

自从引入fork模式以来,我一直在努力调试,直到我发现了这个简单的技巧。在BuildConfig.groovy中,将
grails.project.fork
更改为如下内容:

grails.project.fork = [
   test   : [maxMemory: 1024, minMemory: 128, debug: false, maxPerm: 256, daemon:false, jvmArgs: ['-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005']],
   run    : [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: ['-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005']],
   war    : false,
   console: [maxMemory: 1024, minMemory: 128, debug: false, maxPerm: 256]
]
#!/usr/bin/env bash
while ! nc -z localhost 5005; do sleep 0.1; done;
注意
run
test
配置中的
jvmArgs
。这是在执行fork模式时简单地传递给Java的

接下来,您必须按照上一步中的定义,将远程调试挂接到端口上

为方便起见,您可以配置一个外部工具,等待调试激活,然后启动调试会话。基本上,它在循环中运行
nc
,直到指定的端口处于活动状态。最简单的形式如下所示:

grails.project.fork = [
   test   : [maxMemory: 1024, minMemory: 128, debug: false, maxPerm: 256, daemon:false, jvmArgs: ['-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005']],
   run    : [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: ['-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005']],
   war    : false,
   console: [maxMemory: 1024, minMemory: 128, debug: false, maxPerm: 256]
]
#!/usr/bin/env bash
while ! nc -z localhost 5005; do sleep 0.1; done;
您可以将此脚本配置为外部工具,并使其在调试开始之前运行(在配置新的远程调试会话时,将其添加到“启动前”框)