13
votes

I am trying out the Scala web framework Scalatra. According to the docs here, the steps to enable IntelliJ debugging are:

  1. Add the usual JDK options for remote debugging: "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
  2. Create a "Remote" run configuration in Intellij
  3. Start up sbt, run jetty:start, and then start the remote debugger

When I do this, SBT prints out:

Listening for transport dt_socket at address: 5005

And IntelliJ prints:

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

However, breakpoints do not seem to be working. When I hit the following endpoint, with a breakpoint at the *:

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

The code does not stop at that line, but continues so I get the response DONE back.

I am using Java 1.8.0_111, Scala 2.12, and SBT 0.13.15.

4

4 Answers

5
votes

This is what I use for remote debugging:

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

The value you use above in your answer, -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005, is used in the For JDK 1.4.x field.

2
votes

Ah finally, After big struggle ! I found it for me !

I needed to disable forking in build.sbt

 fork in Test := false,

It makes total sense, as it's only the first JVM who would get to be attach to the IDE.

I hope it help someone !

0
votes

When you start SBT with -jvm-debug you are attaching the debugger to that SBT process, jetty:start will fork and run jetty in a new process. To be able to debug your app, you must set the var debugPort in build.sbt (.settings(debugPort in Jetty := 5005)) or insider SBT repl (set debugPort in Jetty := 5005) and then start jetty by using jetty:debug (I'm assuming you are using xsbt-web-plugin).

0
votes

In the Scalatra docs, step 1 says to update the javaOptions in the build.scala file. Instead, updating the build.sbt file fixed the issue for me. After updating the correct file, the rest of the steps in the docs worked perfectly.

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)