Debugging 在Gradle和IntelliJ 2016.3.5中调试带有断点的JVM应用程序(Java或Scala)

Debugging 在Gradle和IntelliJ 2016.3.5中调试带有断点的JVM应用程序(Java或Scala),debugging,intellij-idea,gradle,jvm,breakpoints,Debugging,Intellij Idea,Gradle,Jvm,Breakpoints,我有一个JVM应用程序,我需要在IntelliJ 2016.3.5中使用带有Gradle任务(作为依赖项运行和测试)的断点进行调试 关于如何使用Gradle和IntelliJ完成调试,有多种来源: (最有用的一个) 然而,这些来源要么已经过时,要么是用于另一种情况。我不想调试Gradle脚本,而是调试运行实际Java/Scala应用程序的JVM。此外,IntelliJ的最新版本使用Gradle工具API,该API不提供关闭守护进程的选项。JetBrains的本机支持仅通过直接使用运行和测

我有一个JVM应用程序,我需要在IntelliJ 2016.3.5中使用带有Gradle任务(作为依赖项运行和测试)的断点进行调试

关于如何使用Gradle和IntelliJ完成调试,有多种来源:

  • (最有用的一个)
  • 然而,这些来源要么已经过时,要么是用于另一种情况。我不想调试Gradle脚本,而是调试运行实际Java/Scala应用程序的JVM。此外,IntelliJ的最新版本使用Gradle工具API,该API不提供关闭守护进程的选项。JetBrains的本机支持仅通过直接使用运行和测试任务上的调试按钮提供,但如果它们被定义为来自另一个任务的依赖项(例如,检查),则不提供

    据消息人士称,这是今后的方向:

    run { // or test, doesn't matter
        jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
        // xor, or both, doesn't seem to make any difference
        debug true
    }
    
    无论如何,Gradle(或JVM)将开始监听端口5005:

    然后,我使用以下参数创建了远程配置:

    但当我启动IntelliJ远程调试任务时,它失败了:


    我还尝试过使用端口5006和suspend=n,但没有成功。在此之前,我尝试在IntelliJ Gradle运行任务中使用Gradle参数。然后,它确实连接到了Gradle脚本,但似乎连接到了应用程序JVM,因为它没有在断点处中断。如何解决这个问题?

    与此同时,我自己找到了解决办法。如果您有类似的问题,请使用debug选项遵循上面提到的方法

    test {
        debug true
    }
    
    但请确保IntelliJ重新启动后,设置中接受外部连接:

    然后,它连接到正确的JVM,并使用远程任务在断点处中断:

    但是,如果在启用相同选项(外部连接)的情况下重新启动IntelliJ,则调试任务可能会由于端口阻塞而失败:

    因此,出于某种原因,IntelliJ会在重新启动后阻塞该端口,但必须启用调试任务的设置才能工作。这很奇怪,我不认为它是故意这样做的

    无论如何,如果禁用设置并重新启动,端口将再次打开。然后,重新启用设置,不重新启动,只运行Gradle任务和调试任务。它会起作用的


    我希望这能帮助其他人找到一个中间解决方案,用Gradle和IntelliJ调试JVM应用程序,其中有一些令人困惑且部分过时的答案。如果有人有更好或更简单的建议,请随意添加您的答案。

    调试gradle任务,如“测试”、“运行”,实际上所有实现JavaForkOptions接口的gradle任务,应该从2014年起在IntelliJ中工作

    为什么不能简单地使用Gradle调试配置,例如,在Gradle工具窗口的Gradle任务上下文菜单中使用调试操作?因为在这种情况下,它实际上是为我调试Gradle脚本,而不是Java或Scala代码。这意味着,Java或Scala代码中的断点不会起任何作用。我重新检查了它,甚至没有调试Gradle脚本。正如您在我的屏幕截图上看到的,它适用于Java应用程序。你能分享这个项目和复制的步骤吗?我现在已经创建了一个新的空项目来复制这个问题,并在Gradle脚本中尝试了不同的设置。我的错误是通过中间任务(例如,检查测试)启动运行和测试任务。但调试似乎只有在直接在相关任务上启动(即,直接启动测试或使用调试选项运行)时才起作用。我没想到Gradle或IntelliJ会区分第一个任务。奇怪的是,如果我使用debug按钮,断点就会被忽略。您可以分享您使用的Gradle版本吗?使用哪个版本几乎无关紧要,实际上从1.9开始的所有版本都应该可以工作。您可以分享这个项目来说明这个问题吗?是的,我可以确认,但是检查任务没有实现像run或test这样的JavaForkOptions接口。还不支持调试由另一个任务触发的任意任务(如本例中的“检查”)。解决方法是显式使用要调试的gradle任务。此限制在IDEA 2018.2中已修复。应该可以调试几乎所有由Gradle任务启动的java进程,Gradle DSL块中的断点也应该可以工作。详情请参阅