从IntelliJ调试功能测试

时间:2015-06-17 15:02:54

标签: debugging grails intellij-idea remote-debugging

我正在开发一个带有一套(Geb)功能测试的Grails应用程序。我曾经能够从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]

1 个答案:

答案 0 :(得分:0)

自从引入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]
]

请注意jvmArgsrun配置中的test。在fork模式执行时,这很简单地传递给Java。

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

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

#!/usr/bin/env bash
while ! nc -z localhost 5005; do sleep 0.1; done;

您可以将此脚本配置为外部工具,并在调试开始之前使其运行(在配置新的远程调试会话时将其添加到“#39;启动之前”框中)