IntelliJ远程调试器连接成功,但断点无法正常工作。

15

我正在尝试使用Scala Web框架Scalatra。根据这里的文档,启用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。


我通过下载Maven源代码解决了这个问题。https://dev59.com/lYHba4cB1Zd3GeqPNzCF#71231272 - Litchy
4个回答

6

以下是我用于远程调试的方法:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005.

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


5
啊,终于!经过一番努力,我找到适合我的了!
我需要在 build.sbt 中禁用 forking。
 fork in Test := false,

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

希望对某些人有所帮助!


0
Scalatra文档中,第一步说要更新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)


0

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


我必须使用xsbt-web-plugin 3.0才能使其工作,这是plugin.sbt中的代码:addSbtPlugin("com.earldouglas" %% "xsbt-web-plugin" % "3.0.0") - brunovianarezende
这很有道理,但是没有起作用。我已经添加了以下代码: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运行Debug,得到:Connected to the target VM, address: 'localhost:5005', transport: 'socket'但是断点还是没有生效 :-( - Joaquim d'Souza
此外,这是我在IntelliJ中用于远程调试的代码:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005。您上面展示的代码是用于 JDK 1.4.x 的。 - brunovianarezende
可以把那个加到答案里让我接受吗?太棒了!我不需要使用“xsbt-web-plugin”或“set debugPort in Jetty := 5005”。 - Joaquim d'Souza
但是,你需要使用jetty:debug吗? - brunovianarezende
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接