【问题标题】:IntelliJ IDEA Debugger isn't working on a Grails ProjectIntelliJ IDEA 调试器不适用于 Grails 项目
【发布时间】:2013-10-15 09:22:02
【问题描述】:

我无法在 IntelliJ IDEA 中调试我的代码。当调试模式处于活动状态并正在运行时,但断点没有检查表示有效且可停止断点的“v”。

看图:

我真的在网上搜索答案。我该怎么办?

【问题讨论】:

  • 它有用吗?我遇到过 intellij 和 grails 不同步的情况,因此调试停止工作,因为 intellij 没有“意识到”该代码。 'grails clean' 很快解决了这个问题。什么版本的 Intellij 和 Grails?
  • 我使用的是最新版本。 Grails 2.3.0 和 Intellij 12.1.5。 Clean 命令也不起作用。我意识到 .grails/2.3.0/projects 中的项目文件夹没有创建。
  • 当我在“grails.project.fork”下的compile设置中错误地设置了“debug: true”时发生了这种情况。

标签: java debugging grails intellij-idea


【解决方案1】:

我已经尝试了这里提到的所有内容,但没有成功。 唯一有用的信息是here

本质上,您应该通过将以下内容添加到grails-app/conf/BuildConfig.groovy 来禁用分叉执行:

grails.project.fork = [
    test: false,
    run: false
]

现在可以在 IntelliJ IDEA Ultimate Edition v.12.1.6 中进行调试,只需普通调试即可,无需远程调试。 在 Grails 2.3.1、Java 1.7.0_45、Windows 7 64 位上测试。

【讨论】:

  • 在 Grails 2.3.4 和 IntelliJ 13 上测试过 +1。工作。
  • 在 Grails 2.3.8 和 IntelliJ 13.1.3 上测试过,并且 +1 工作正常。
  • 在 Grails 2.4.0 和 IntelliJ 13.1.3 上测试 - 一切正常!我个人只是评论了上述配置图中的runtest 行。
  • 这会起作用,但你应该知道分叉意味着什么。好文章here
  • 在 Grails 2.5.0 和 IntelliJ 14.1.4 上测试不工作
【解决方案2】:

试试这个:

在想法中,从“运行”按钮旁边的列表中选择编辑配置。然后添加Remote,选择你的名字并保留默认的远程配置设置。 (端口 5005 等)

使用从控制台运行您的应用程序

grails run-app --debug-fork

在idea中,从列表中选择您的配置并在控制台显示信息时点击调试按钮:

Listening for transport dt_socket at address: 5005

【讨论】:

  • 这就是我要找的。关键是使用 IntelliJ 自动尝试为我的 grails 应用程序插入的调试配置设置 new Remote 调试配置 而不是我的应用程序代码。我在控制台命令中使用了grails -debug run-app,然后从 IntelliJ 以调试模式运行新的远程配置,它直接连接到我的 grails 应用程序中。
【解决方案3】:

从 Grails 2.3 开始,多个 Grails 命令(例如run-apptest-app)的分叉执行introduced。 如果您只是从 IntelliJ IDEA 调试 Grails 应用程序,GrailsStarter 进程将在调试选项打开的情况下启动。 IDEA 控制台上的输出将是:

/usr/lib/jvm/default-java/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59935,suspend=y,server=n [...] /opt/idea-IU-133.330/lib/idea_rt.jar org.codehaus.groovy.grails.cli.support.GrailsStarter [...] run-app Connected to the target VM, address: '127.0.0.1:59935', transport: 'socket'

应用程序本身将在名为ForkedTomcatServer 的单独进程中启动。这是你的代码运行的地方,也是你的调试器应该实际连接的地方。

为此,在BuildConfig.groovyrun 配置grails.project.fork 中设置debug: true。现在只需从 IDEA 运行 Grails(不要调试),当应用程序准备好服务 HTTP 请求时,您将在控制台中看到以下行:

Listening for transport dt_socket at address: 5005

这是您要将单独的remote run configuration 定向到的位置。连接远程调试器后,立即发出 HTTP 请求,即可进行调试。

您还可以通过将与grails.project.fork 中的命令条目关联的值设置为false 来完全禁用分叉执行 compile/test/run/war/console Grails 命令。但是,您将失去 Grails 2.3 中添加的分叉执行的好处。

【讨论】:

【解决方案4】:

可以通过两种方式调试 grails (2.3+) 应用程序。

1.简单的解决方案:禁用调试

编辑 BuildConfig.groovy:

grails.project.fork = [
    war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, fork ...
    run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, fork ...

grails.project.fork = [
    war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, fork ...
    run: false,

优点:

  • 操作简单(并继续您的开发)

缺点:

  • 这消除了执行运行时代码替换的能力。这意味着如果您更改代码,它将不再被自动拾取,您需要重新启动应用程序才能看到更改。这可能非常耗时。

2。涉及的解决方案:调试分叉运行时

这是一个稍微复杂的解决方案,您可以将调试器附加到正在运行的 grails 应用程序。更详细的描述in this blog post

设置完成后,您有一个额外的运行配置允许您以分叉模式启动 grails,还有另一个额外的运行配置允许您调试该分叉模式。问题是您必须同时启动两者,否则它不起作用。

优点:

  • 您有调试和运行时代码替换
  • 这不会干扰以正常模式启动应用程序。 (即您有额外的选择)

缺点:

  • 设置需要一点时间
  • 在调试模式下启动需要一个更复杂的两步过程(即需要更长的时间)

注意事项

解决方案 2 的优势在于它提供了灵活性。我个人不经常使用debug,所以就在正常模式下启动。当我想调试时,我在调试模式下重新启动。

如果您需要调试并且还需要大量重新启动,则解决方案 1 会更好。例如,当您在 BootStrap.groovy 中处理域类或数据库设置时。

【讨论】:

    【解决方案5】:

    你看到这篇文章了吗?它详细说明了如何逐步解决问题。

    http://mrhaki.blogspot.com/2013/12/grails-goodness-debugging-app-in-forked.html

    【讨论】:

      【解决方案6】:

      在 2016 年使用 Intellij 15.0.4 的 Grails 3.x 上,其他答案都不适用于我。这对我有用:

      使用以下命令在 intellij 中启动 grails:

      run-app  --debug-jvm
      

      控制台应该输出: “在地址监听传输 dt_socket:5005 Grails 应用程序在环境中以http://localhost:8080 运行:开发"

      现在您可以在 Intellij 中添加类型为“远程”的新配置。然后用它的默认值启动它。

      新的调试控制台窗口应该写: "连接到目标VM,地址:'localhost:5005',传输:'socket'"

      完成。

      对于那些感兴趣的人,关于启动可调试服务器的 grails 3.x 文档的参考在第 2.8 节,runningAndDebuggingAnApplication:

      http://grails.github.io/grails-doc/3.1.x/guide/gettingStarted.html#runningAndDebuggingAnApplication

      “有几种方法可以执行 Application 类,如果您使用的是 IDE,那么您只需右键单击该类并直接从您的 IDE 中运行它,这将启动您的 Grails 应用程序。 这对于调试也很有用,因为在命令行中使用 run-app --debug-jvm 命令时,您可以直接从 IDE 进行调试,而无需连接远程调试器。”

      重要提示。当我尝试“只需右键单击该类并直接从您的 IDE 运行它”时,该应用程序确实启动了。但是,我发送给控制器的所有请求都导致 500 错误消息:“无法解析名称为 'grailsDispatcherServlet' 的 servlet 中名称为 '/myendpoint' 的视图。

      所以,我回到上面的说明。

      【讨论】:

        【解决方案7】:

        对于 Grails 3 和 Idea (2016.1),这是一件非常简单的事情。正如其他答案中所建议的那样,不再需要编辑任何文件。

        由于某种原因,Idea 工具栏中的调试图标是灰色的,因此您只需导航到您的应用程序入口点(具有启动应用程序的静态 void main 方法的类),单击其中一个在左侧装订线中运行箭头并选择“调试”选项。

        来自 JetBrains 文档:

        https://www.jetbrains.com/help/idea/2016.1/getting-started-with-grails-3.html

        调试 Grails 3 应用程序

        IntelliJ IDEA 让您可以使用以下方式调试 Grails 3 应用程序 应用程序.groovy。

        在 Project 工具窗口中,打开 init 目录并右键单击 Application.groovy 从下拉列表中选择 Debug Grails:'name' grails3_debug_app 也可以使用编辑器启动调试 过程。

        【讨论】:

          【解决方案8】:

          只有三个猜测:

          尝试运行run-app,而不是run-war,两者都应该可以工作,但可能run-war 不工作。

          或者:尝试从控制台远程调试:

          grails -debug run-app 然后在 Idea 中连接 Remote Debug。

          或者,最后的手段:将您的项目降级到以前的 Grails 版本可能会奏效。是的,这真的很烦人。

          希望这会有所帮助。

          【讨论】:

            【解决方案9】:

            我在 Mac Os x Lion 上使用 Intellij 最新的 Grails 2.3.4 进行了测试。

            然后我尝试了 Igors 的建议,它在没有分叉模式的情况下工作。

            grails.project.fork = [
                test: false,
                run: false
            ]
            

            详情请查看grails documentation

            如果你想调试分叉模式,你应该检查以下博客文章的解释非常好。

            http://blog.jdriven.com/2013/12/grails-goodness-debugging-app-forked-mode/

            【讨论】:

              【解决方案10】:

              这不应该是默认配置,只能由个人选择。做两个配置只是让这个东西在 intellij 中以调试模式运行是一件非常痛苦的事情。首先,您必须通过在 run-app 后添加“--debug-fork”来设置或修改正常运行配置。其次,您必须配置远程调试,同时接受所有默认值。然后你必须运行运行配置,当它运行时,你运行调试配置。多么痛苦。我更喜欢在开发时完全取消没有分叉选项的运行。时间就是金钱,我没有时间胡闹。请参阅 Mr.HAKI 对此的解释。 http://blog.jdriven.com/2013/12/grails-goodness-debugging-app-forked-mode/

              【讨论】:

              • 我认为如果您先给出答案,然后再评论为什么它令人讨厌,那么答案会更有用。或许也可以省略大部分评论。
              • 没问题...请参阅上面我编辑的条目:blog.jdriven.com/2013/12/… 祝你好运。
              • 这里有一个更新。我似乎不再遇到这个问题,但如果它对您来说不那么重要,我注释掉了 conf 目录下的部分 BuildConfig.groovy 文件,该文件用于在 grails 运行时分叉 JVM 以优化内存。 //取消注释(并调整设置)fork JVM 以隔离 //classpaths //grails.project.fork = [ // run: [maxMemory:1024, minMemory:64, debug:false, maxPerm:256] //]
              【解决方案11】:

              结帐this 关于调试 Grails 分叉模式的博客。

              【讨论】:

                【解决方案12】:

                1.terminal --> 命令:run-app --debug-jvm

                控制台输出: grails> 运行应用程序 --debug-jvm |正在运行应用程序... 在地址:5005 监听传输 dt_socket

                注意:根据您的客户端系统更改/更新端口

                1. 添加调试器 [默认应在端口 5005 上],“远程 JVM 调试”,添加新的 [Intelli J 设置]

                3.完成后,将设置新的调试器 [步骤 2],在调试模式下运行 webapp。

                控制台输出: 连接到目标VM,地址:'localhost:5005',传输:'socket'

                1. Grails[intellij] 在 8080 处嵌入了 tomcat,因此点击“localhost:8080”并单击控制器 [您添加切换点的位置]

                5.configuration 现在已连接 - 继续探索您的调试技能以解决问题 :) :)

                【讨论】:

                • 在发布答案或问题时使用 Stackoverflow 编辑器中可用的格式选项。
                猜你喜欢
                • 2018-01-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-25
                • 1970-01-01
                • 2017-11-15
                • 1970-01-01
                相关资源
                最近更新 更多