从IntelliJ调试Grails应用程序

时间:2015-07-07 16:16:27

标签: debugging grails intellij-idea

我一直在努力从IntelliJ内部调试Grails 2.5.0应用程序。具体来说,我发现很难配置应用程序

  1. 可以调试功能测试
  2. 可以运行功能测试
  3. 可以调试应用
  4. 可以运行该应用
  5. 从IntelliJ(版本14.1.4)中启动(1)和(2)时。

    这是toy Grails app我用来调查此问题,它有一个功能测试。调试工作的关键似乎是这些JVM分支设置BuildConfig.groovy

    grails.project.fork = [
            // configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
            //  compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
    
            // configure settings for the test-app JVM, uses the daemon by default
            test   : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon: true, jvmArgs: jvmArgs],
            // configure settings for the run-app JVM
            run    : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve: false, jvmArgs: jvmArgs],
            // configure settings for the run-war JVM
            war    : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve: false],
            // configure settings for the Console UI JVM
            console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
    ]
    
    // Include the line below to debug functional tests from IntelliJ. The tests should be launched in Debug mode from IntelliJ
    //grails.project.fork = null
    

    Debug run-app(3)

    启用分叉后,可以通过从IntelliJ内部运行来调试应用程序,然后从IDE启动远程调试器以连接到端口5005上的应用程序.JVM分叉设置可确保应用程序始终在启用远程调试的情况下运行,所以一定要通过运行来启动应用程序,而不是调试它。

    调试功能测试(1)

    要调试功能测试,您需要包含this line

    grails.project.fork = null
    

    这样就分叉了(并且禁用了远程调试。然后你可以通过IntelliJ调试配置启动测试来调试功能测试。

    根据是应用程序还是正在调试的功能测试,必须包含/注释掉这一行是相当繁琐的,所以我正在寻找一个更简单的解决方案。

    有人可能会认为这可以通过

    来避免
    if (Environment.current == Environment.TEST) {
        grails.project.fork = null
    }
    

    但由于某些未知原因,这不起作用。

3 个答案:

答案 0 :(得分:3)

I have the following settings in BuildConfig.groovy:

grails.project.fork = [

    // configure settings for the test-app JVM, uses the daemon by default
    test: false, // see http://youtrack.jetbrains.com/issue/IDEA-115097
    // configure settings for the run-app JVM
    run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
    // configure settings for the run-war JVM
    war: false,
    // configure settings for the Console UI JVM
    console: false
]

You will need to add 2 run configurations in intellij:

  • Add a new Run Configuration for your grails project. Use run-app --debug-fork as command line.
  • Add a new remote debug configuration. Just use the default settings.

To debug you app, run the first configuration. The grails app will start and should print Listening for transport dt_socket at address: 5005. Once you see this message, run the debug configuration...

Let me know if you need screenshots

答案 1 :(得分:0)

good hack用于启动远程调试而不需要为#34;侦听传输dt_socket at address:5005"线。只需运行远程调试和运行应用程序

用几句话说:

BuildConfig.groovy

// jvmArgs make it so that we can run in forked mode without having to use the `--debug-fork` flag
// and also has suspend=n so that it will start up without forcing you  to connect a remote debugger first
def jvmArgs = ['-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005']

grails.project.fork = [
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256,     daemon:true, jvmArgs: jvmArgs],
    run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false, jvmArgs: jvmArgs],
    war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false, jvmArgs: jvmArgs],
    console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, jvmArgs: jvmArgs]
]

在启动远程调试器之前监控端口

  

如果在intellij中创建一个新的远程调试目标并在其中运行它   在运行应用程序或测试的同时,它会因为调试而失败   港口尚未开放。如果你手动完成,你需要等待   记录消息说调试端口已打开。那就更多了   保姆,我们可以避免通过一个小的shell脚本欺骗。

     

这是一个使用nc(netcat)命令监视a的shell脚本   localhost端口,只有在端口可用时才会继续。   将它保存为路径中的wait_for_port.sh:

#!/usr/bin/env bash
PORT_NUMBER="$1"

function usage {
    echo "usage: ${0##*/} "
    echo "ex: ${0##*/} 5005"
}

if [ -z $PORT_NUMBER ]; then
    usage
    exit 1
fi

echo "waiting for port $PORT_NUMBER to open up"

while ! nc -z localhost $PORT_NUMBER; do sleep 0.1; done;
  

让它使用此脚本作为监视端口5005的“外部工具”   在尝试连接之前。

答案 2 :(得分:0)

要调试应用程序本身,从 Grails 3 开始,我们可以转到 grails-app/init,然后右键单击 Application.groovy 类并单击 Debug 'Application'