IntelliJ 远程调试器连接,但断点不起作用

IntelliJ remote debugger connects, but breakpoints are not working

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

  1. 添加常用的 JDK 远程调试选项:"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
  2. 在 Intellij 中创建 "Remote" 运行 配置
  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.

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

这是我用于远程调试的:

-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 字段。

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

我需要在 build.sbt

中禁用分叉
 fork in Test := false,

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

希望对大家有所帮助!

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)