Depuración de código Scala con simple-build-tool (sbt) e IntelliJ


¿Cuál es la forma más fácil de depurar código Scala administrado por sbt utilizando el depurador integrado de IntelliJ? La documentación de "RunningSbt" del sitio de código de Google de sbt enumera comandos para ejecutar la clase principal para un proyecto o las pruebas, pero parece que no hay comandos para depurar.

Pregunta de seguimiento: ¿cuál es la forma más fácil de conectar el depurador de IntelliJ a Jetty cuando se utiliza el comando jetty-run de sbt?

Author: stites, 2010-11-11

12 answers

Para la depuración ordinaria en IntelliJ, puede usar una configuración de ejecución/depuración de aplicaciones de la manera habitual, independientemente de si está utilizando sbt para compilar su código.

Para conectarse a su aplicación ejecutándose en Jetty, deberá crear una configuración de depuración remota. Cuando lo haga, IntelliJ le dará un conjunto de argumentos de línea de comandos para ejecutar la JVM remota something algo así como

- Xdebug - Xrunjdwp:transport = dt_socket,server=y,suspend=n, address=5005

Inicie sbt con estos argumentos y luego ejecute jetty-run. Finalmente, inicie la configuración de depuración remota en IntelliJ. Este hilo podría ser útil.

 41
Author: Aaron Novstrup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-11 02:35:28

Hay una muy conveniente -jvm-debug marca en los paquetes SBT oficiales para Mac, Linux & Windows. Puede usar la bandera para especificar el puerto de depuración:

sbt -jvm-debug 5005

Bajo las cubiertas , esto inicia la JVM para SBT con el típico encantamiento de depuración detallado:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

Ahora puede ejecutar su código de forma normal, por ejemplo con el comando sbt run.

Configurando IntelliJ para conectarse al código en ejecución...

Ahora te conectas IntelliJ a su proceso en ejecución utilizando un Configuración de depuración remota. Tenga en cuenta que los 3 campos superiores en este formulario, aunque asustadizos, son solo para que copie el texto hacia fuera de, en lugar de hacia dentro (están dando el encantamiento de depuración detallado especificado anteriormente, que -jvm-debug ya se encarga de usted) - la única configuración que puede cambiar está en la secciónSettings a mitad de camino:

Configuración de depuración remota en IntelliJ

 155
Author: Roberto Tyley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 15:54:57

También tuve algunos problemas con esto, así que a riesgo de ser demasiado detallado, esto es lo que hice:

CONFIGURACIÓN

  1. Crear una configuración de ejecución para sbt jetty-run

    • Vaya a Ejecutar > Editar configuraciones
    • Haga clic en el icono [ + ] y elija Scala Compilation Server
    • Ingrese el nombre que desee, y haga clic en la casilla de verificación "Ejecutar Acción SBT" y seleccione la acción SBT jetty-run desde [...]
  2. Crear una depuración configuración para depuración remota

    • Vaya a Ejecutar > Editar configuraciones
    • Haga clic en el icono [ + ] y elija Remoto
    • Introduzca el nombre que desee y copie la línea -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 (asegúrese de hacer clic en Aceptar para crear la configuración)
  3. Configure el complemento sbt para ejecutar las opciones de vm anteriores

    • Vaya a Archivo > Configuración > SBT
    • Pegue la línea -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 en el cuadro de parámetros de VM, después de los que ya están hay

DEPURACIÓN

  1. Establezca los puntos de interrupción como desee
  2. Inicie el servidor web jetty eligiendo la configuración sbt jetty-run que creó anteriormente y eligiendo Ejecutar > Ejecutar o haciendo clic en la flecha verde
  3. Inicie el depurador remoto eligiendo la configuración de depuración remota que creó anteriormente y eligiendo Ejecutar > Depurar o haciendo clic en el icono de error
 39
Author: Jamie Forrest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 22:31:07

Estoy agregando otra respuesta aquí, porque encontré esta pregunta al buscar un problema relacionado: Depurar clases de prueba usando puntos de interrupción.

Estoy usando ScalaTest, y normalmente corro una suite usando el comando 'test-only' de sbt. Ahora cuando quiero usar el depurador interactivo, puedo hacer lo siguiente:

Cree una nueva Configuración Run/Debug del tipo 'ScalaTest', ponga el nombre principal "Test Class:" y elija "Before launch: Run SBT Action 'test-compile'". Eso es todo, puedes coloque los puntos de interrupción ahora en las fuentes de prueba y ejecute esta configuración.

 7
Author: 0__,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-20 12:40:24

Este funciona para mí cada vez, y lo único que necesita configurar es la depuración remota en IntelliJ; Arranco SBT con parámetros JVM desde el terminal en IntelliJ:

sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

Después de eso puedo comenzar la depuración remota en localhost: 5005

 6
Author: Erik Madsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-02 14:46:56

Ninguna de estas respuestas o enlaces proporcionados funcionó para mí, así que una vez que descubrí esto, pensé que compartiría...

Incluyendo la comprensión de fondo que no tenía cuando empecé...

Esto se basa principalmente en las instrucciones aquí solo con una explicación adicional que me llevó a través de ella.

Mi Entorno: Scala 2.10.2, SBT 0.13, e IntelliJ 13.1

Antecedentes:

  • Por cualquier razón, usando SBT para compilar Scala en IntelliJ no está integrado de la forma en que están los proyectos Maven (que permiten la depuración muy fácilmente).
  • Según tengo entendido, cuando compila con SBT, está compilando en un proceso separado, por lo tanto, necesita estar depurando remotamente.

¿Qué es la depuración?

  • La depuración es un modo en el que puede ejecutar su JVM o aplicación que le permite controlar el flujo de ejecución de código.
  • La herramienta de depuración que utilice puede emitir comandos al Motor de Depuración que le dice "ejecutar la siguiente línea de código y luego pausar de nuevo" o "continuar ejecutando" o "obtener el valor de la variable almacenada aquí en la memoria".

¿Qué es la Depuración remota?

  • La depuración remota es la depuración a través de una conexión de red (socket).
  • Esta conexión de red le permite emitir los comandos al Motor de depuración desde una máquina remota.
  • Esto es útil para cuando se desea depurar código que se está ejecutando en un servidor remoto, PERO
  • También es útil para situaciones como el código Scala que se ejecuta bajo SBT y se inicia a través de un servidor web, como Jetty o Tomcat, separado de su entorno IntelliJ.

Haciendo referencia al enlace anterior, las siguientes explicaciones/modificaciones son útiles:

  1. Configure IntelliJ para iniciar SBT con la configuración de JVM "enable debugging", incluido el puerto a usar al configurar el socket de red. (sin cambios) agregue los parámetros de la máquina virtual con nombre a la configuración de IntelliJ.
  2. Asegúrese de que su número de puerto aquí coincida con la configuración de JVM del Paso 1.
  3. Cuando inicie SBT, debe hacerlo desde el complemento de consola SBT (que es lo que configuró en el Paso 1). Si está ejecutando SBT fuera de IntelliJ (en la línea de comandos), necesitará iniciar SBT con los mismos parámetros de VM del paso 1 (no hice esto; así que no hay instrucciones). Después de este paso, SBT se está ejecutando (pero su código es todavía no) y la JVM está configurada para la Depuración Remota.
  4. Esto inicia la herramienta de depuración IntelliJ, que se conecta a la JVM que inició en el Paso 3.
  5. Finalmente, se inicia la compilación en la consola SBT. Puede hacer esto con cualquier comando de compilación, incluyendo un comando de compilación continua. Si se vuelve a compilar de forma continua, se producirá la recompilación, pero no mientras la ejecución del código esté pausada por el depurador.
 5
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 02:32:13

Usando Scala 2.10 y SBT 0.12, lo conseguí trabajando así: http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html

 3
Author: Tulio Domingos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 08:43:56

También he estado luchando con la depuración en Windows con una aplicación Spray-can / Akka / Scala construida a través de SBT, utilizando Intellij. Juntando varias sugerencias, el enfoque más simple para mí fue:

  1. Asegúrate de tener sbt.Revolver en su proyecto / plugsin.archivo sbt, por ejemplo,

    AddSbtPlugin ("io.spray " % "sbt-revólver" % "0.7.1")

  2. Establece javaoptions en tu compilación.archivo sbt:

    JavaOptions: = Seq ("- Xdebug", "- Xrunjdwp:transport = dt_socket, server = y, suspend=y, address = 5005")

En particular, utilice la opción suspend=y. Esto retendrá la aplicación hasta que conecte un depurador remoto desde Intellij

  1. Configure una configuración del depurador en Intellij a través del menú Ejecutar / Editar configuraciones. Pulse el botón+, seleccione la opción" Remoto". Asegúrese de que las entradas coincidan con las opciones javaoptions anteriores, en particular la dirección de puerto de 5005. Dale a la configuración un nombre como 'Spray'.

  2. Desde la consola SBT utilice el comando re-start. Debería ver la dirección de puerto 5005 en la salida de retroalimentación.

  3. En Intellij establezca sus puntos de interrupción.

  4. En Intellij, seleccione la opción Run \ Debug 'Spray'. Esto debería conectarse al servidor web de spray-can. Deberías poder ver muchos subprocesos en la ventana de depuración.

  5. Tenga en cuenta que algunas de las directivas Get en Spray parecen ejecutarse en el arranque, pero no repetidamente al llamar al sitio web.

 3
Author: Herc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-14 12:08:45

File- > Settings - > Other Settings - > SBT Parámetros de VM -Xmx512M-XX: MaxPermSize = 256M-Xdebug-Xrunjdwp: transport=dt_socket,server=y,suspend=n,address = 5005

Ejecutar - > Editar configuraciones Presione + y luego seleccione remoto Pulse Aplicar

Ahora en la consola SBT (Iniciada por IntelliJ) cuando ejecute el comando 'run' verá "Listening for transport dt_socket at address: 5005"

Ahora presione Ejecutar->Depurar. Verá los menús de depuración activados a continuación. Tiene dos pestañas Depurador y Consola.

Use F7 para de la siguiente línea a la siguiente

Elegí suspender para ser n. Siendo y cuando ejecuté el comando run se quedó atascado

 3
Author: rayfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-26 12:36:30

Para lo que vale Windows folk, edite %SBT_HOME%\bin\sbt.bat y localice las siguientes líneas de código:

:run

"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
if ERRORLEVEL 1 goto error
goto end

Luego reemplácelos con este código:

FOR %%a IN (%*) DO (
  if "%%a" == "-jvm-debug" (
    set JVM_DEBUG=true
    set /a JVM_DEBUG_PORT=5005 2>nul >nul
  ) else if "!JVM_DEBUG!" == "true" (
    set /a JVM_DEBUG_PORT=%%a 2>nul >nul
    if not "%%a" == "!JVM_DEBUG_PORT!" (
      set SBT_ARGS=!SBT_ARGS! %%a
    )
  ) else (
    set SBT_ARGS=!SBT_ARGS! %%a
  )
)

if defined JVM_DEBUG_PORT (
  set _JAVA_OPTS=!_JAVA_OPTS! -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=!JVM_DEBUG_PORT!
)

call :run %SBT_ARGS%

if ERRORLEVEL 1 goto error
goto end

:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
goto :eof

Lo mejor que puedo hacer para obtener el mismo comportamiento para -jvm-debug cuando se ve en el lanzador de scripts Bash

NB. No creo que %SBT_HOME% exista realmente fuera de este script, a menos que haya creado explícitamente en su entorno, pero de todos modos obtendrá el punto: D

 2
Author: Darren Bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-01 21:35:00

También tengo el mismo problema, me gusta compartir cómo lo resolví. Por cierto, estoy usando Ubuntu 14.04 e IntelliJ 15.

  1. En la configuración - > SBT - > Pegado debajo de la línea en el cuadro de texto Parámetros de VM:

    - XX: MaxPermSize = 384M-Xdebug-Xrunjdwp: transport=dt_socket,server=y,suspend=n,address=5005

  2. Se abre Termilal en IntelliJ y se ejecuta:

    Sbt-jvm-debug 5005

    Nota: debería ver esta línea en la terminal: "Listening for transport dt_socket en la dirección: 5005 "

  3. Editar configuraciones -> Haga clic en + -> Seleccione 'Remoto'

    I. Give some name example: DebugMyModule
    
    II. All needed configurations will be set automatically, But you just verify. In Command line arguments should look like this "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005".
    
    III. In 'Search Sources in Module's Classpath' text box specify your module in which module your test cases are there.
    
    IV. put 127.0.0.1 host instead of 'localhost'. 'localhost' not working for me.
    
  4. Seleccione DebugMyModule en el cuadro de lista Edit Configurationsy haga clic en Debug.

    Nota: Debería ver la vista de depuración abierta y en la consola de depuración Debería poder ver " Conectado a la máquina virtual de destino, dirección: '127.0.0.1:5005', transporte:'socket' "

  5. Ponga puntos de interrupción en algunos casos de prueba en su Clase de prueba.

  6. Llegar a la Terminal donde corres "sbt -jvm-debug 5005 " y corres como abajo

    project <your-module-name>
    it:testOnly package.TestSpec
    

    Por ejemplo: com.mi proyecto.módulo.AddServiceTest[Spec]

  7. Puede ver la depuración iniciada en el punto de interrupción del caso de prueba.

 0
Author: Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-18 17:52:47
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

Prueba esto

 0
Author: shengshan zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-31 13:47:04