【问题标题】:IntelliJ remote debugger connects, but breakpoints are not workingIntelliJ 远程调试器连接,但断点不起作用
【发布时间】:2017-10-29 04:28:15
【问题描述】:

我正在试用 Scala 网络框架 Scalatra。根据文档here,启用 IntelliJ 调试的步骤是:

  1. 为远程调试添加常用的 JDK 选项:"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
  2. 在 Intellij 中创建“远程”运行配置
  3. 启动sbt,运行jetty:start,然后启动远程调试器

当我这样做时,SBT 会打印出来:

Listening for transport dt_socket at address: 5005

IntelliJ 打印:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'

但是,断点似乎不起作用。当我到达以下端点时,在* 处有一个断点:

class AppServlet extends AppStack {
  get("/break-test") {
*   val response = "DONE"
    response
  }
}

代码不会在那一行停止,而是继续,所以我得到了回复DONE

我正在使用 Java 1.8.0_111、Scala 2.12 和 SBT 0.13.15。

【问题讨论】:

标签: java debugging intellij-idea sbt scalatra


【解决方案1】:

这是我用于远程调试的:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,addres‌​s=5005.

您在上面的答案中使用的值-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 用于For JDK 1.4.x 字段。

【讨论】:

    【解决方案2】:

    啊终于,经过一番苦战!我为我找到了!

    我需要在 build.sbt 中禁用分叉

     fork in Test := false,
    

    这完全有道理,因为它只是第一个连接到 IDE 的 JVM。

    希望对大家有所帮助!

    【讨论】:

      【解决方案3】:

      当您使用 -jvm-debug 启动 SBT 时,您将调试器附加到该 SBT 进程,jetty:start 将在新进程中分叉并运行 jetty。为了能够调试您的应用程序,您必须在 build.sbt (.settings(debugPort in Jetty := 5005)) 或内部 SBT repl (set debugPort in Jetty := 5005) 中设置 var debugPort,然后使用 jetty:debug 启动码头(我假设您正在使用xsbt-web-plugin)。

      【讨论】:

      • 啊,好吧,我在其他地方看到码头与 SBT 在同一个 JVM 上运行,但会试一试
      • 我必须使用 xsbt-web-plugin 3.0 才能工作,这是 plugin.sbt 中的代码:addSbtPlugin("com.earldouglas" %% "xsbt-web-plugin" % "3.0.0")
      • 这很有意义,但没有奏效。我有:addSbtPlugin("com.earldouglas" %% "xsbt-web-plugin" % "3.0.1") 然后> set debugPort in Jetty := 5005 > jetty:debug 打印出来:> Listening for transport dt_socket at address: 5005 我从 IntelliJ 运行调试得到:Connected to the target VM, address: 'localhost:5005', transport: 'socket' 但是断点仍然没有运气:-(
      • 好的,所以我的 IntelliJ 已经过时了约 1 年,所以让我更新一下吧!
      • 另外,这是我在 intellij 中用于远程调试的:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005。您在上面显示的内容用于For JDK 1.4.x
      【解决方案4】:

      Scalatra docs 中,第1 步表示更新build.scala 文件中的javaOptions。相反,更新build.sbt 文件为我解决了这个问题。更新正确的文件后,文档中的其余步骤运行良好。

      build.sbt

      val ScalatraVersion = "2.7.1"
      
      ThisBuild / scalaVersion := "2.13.4"
      ThisBuild / organization := "com.example"
      
      lazy val hello = (project in file("."))
        .settings(
          name := "My Scalatra Web App",
          version := "0.1.0-SNAPSHOT",
          libraryDependencies ++= Seq(
            "org.scalatra" %% "scalatra" % ScalatraVersion,
            "org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test",
            "ch.qos.logback" % "logback-classic" % "1.2.3" % "runtime",
            "org.eclipse.jetty" % "jetty-webapp" % "9.4.35.v20201120" % "container",
            "javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided"
          ),
          javaOptions ++= Seq(
            "-Xdebug",
            "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
          ),
        )
      
      enablePlugins(SbtTwirl)
      enablePlugins(JettyPlugin)
      
      

      【讨论】:

        最近更新 更多