Depurar el código de Scala con la herramienta de compilación simple (sbt) e IntelliJ

120

¿Cuál es la forma más fácil de depurar el 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 los 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 usa el comando jetty-run de sbt?

Mateo
fuente
6
Por favor, no mezcle preguntas en el futuro
hennr

Respuestas:

47

Para la depuración normal en IntelliJ, puede utilizar una configuración de ejecución / depuración de la aplicación de la forma habitual, independientemente de si está utilizando sbt para compilar su código.

Para conectarse a su aplicación que se ejecuta 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 comando para ejecutar la JVM remota, algo así como

-Xdebug -Xrunjdwp: transporte = dt_socket, servidor = y, suspender = n, dirección = 5005

Inicie sbt con estos argumentos y luego ejecútelo jetty-run. Finalmente, inicie su configuración de depuración remota en IntelliJ. Este hilo puede resultar útil.

Aaron Novstrup
fuente
1
para mí De la manera habitual , no funciona bien: stackoverflow.com/questions/16337745/…
ses
¿Dónde escribe esto? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622
@ Jwan622 Ejecuta sbt con esos argumentos (por ejemplo, desde la línea de comando, proporcionándolos como argumentos de línea de comando). Luego, ejecute jetty-runen el indicador de sbt.
Aaron Novstrup
así que solo corre sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622
3
Para la mayoría de los usuarios, eso debería funcionar, pero depende de cómo esté configurado sbt en su sistema. Como se señaló en la otra respuesta, es posible que pueda simplemente ejecutar sbt -jvm-debug 5005.
Aaron Novstrup
189

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

sbt -jvm-debug 5005

Bajo las sábanas , 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 normalmente, por ejemplo, con el runcomando sbt .

Configuración de IntelliJ para conectarse al código en ejecución ...

Ahora conecte IntelliJ a su proceso en ejecución mediante una configuración de depuración remota . Tenga en cuenta que los 3 campos superiores en esta forma, mientras que miedo, son sólo para copiar el texto fuera de, en lugar de en (que están dando la depuración detallada encantamiento se ha especificado anteriormente, que -jvm-debugya se toma el cuidado de usted) - la única configuración que puedes cambiar está en la Settingssección a la mitad:

Configuración de depuración remota en IntelliJ

Roberto Tyley
fuente
1
Esto no funciona en Windows, ¿alguna idea de cómo hacer algo similar en esta (pésima) plataforma?
javadba
Este es el script de inicio que creo que se usa para Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Te animo a que averigües cómo modificar el script para aceptar el -jvm-debugparámetro y lo envíes como una solicitud de extracción; tienes muchas posibilidades de beneficiar a todos los que se encuentran en la misma plataforma.
Roberto Tyley
Lo examiné. El script de inicio de Windows es WAY primitive vs linux. No puedo hacer ahora.
javadba
1
Solicitud de extracción fusionada ... ver más abajo
Darren Bishop
3
Sería útil saber dónde insertar el "sbt -jvm 5005" en IntelliJ
eddy147
39

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

PREPARAR

  1. Cree 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, haga clic en la casilla de verificación "Ejecutar acción SBT" y seleccione el embarcadero de acción SBT desde el [...]
  2. Crear una configuración de depuración para depuración remota

    • Vaya a Ejecutar> Editar configuraciones
    • Haga clic en el icono [+] y elija Remoto
    • Ingrese 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 vm anteriores

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

DEPURACIÓN

  1. Establecer puntos de interrupción como desee
  2. Inicie el servidor web de embarcadero eligiendo la configuración de ejecución de embarcadero sbt 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
Jamie Forrest
fuente
16
no hay Scala Compilation Server en el menú Configuraciones. Entonces, ¿necesito algo especial?
Arne
Parece que el paso 1 no es necesario, lo que hago es ejecutar el comando sbt sbt -jvm-debug 5005 console, luego establecer el punto de interrupción en intelllJ Idea, ejecutar la depuración.
Pengfei.X
@ Pengfei.X, sbt -jvm-debug 5005 consoleno funcionó para mí, pero lo sbt -jvm-debug 5005hizo.
Lukasz Czerwinski
8

Este me funciona todo el tiempo, y lo único que necesita configurar es la depuración remota en IntelliJ; Enciendo 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 iniciar la depuración remota en localhost: 5005

Erik Madsen
fuente
7

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 ejecuto una suite usando el comando 'solo prueba' de sbt. Ahora, cuando quiero usar el depurador interactivo, puedo hacer lo siguiente:

Cree una nueva configuración de ejecución / depuración de tipo 'ScalaTest', coloque el nombre principal de "Clase de prueba:" y elija "Antes del lanzamiento: Ejecutar acción SBT 'prueba-compilación'". Eso es todo, puede colocar puntos de interrupción ahora en las fuentes de prueba y ejecutar esta configuración.

0__
fuente
mismo, pero no funciona bien: stackoverflow.com/questions/16337745/…
ses
¿Sabes cómo puedo ejecutar solo una prueba si la clase de prueba tiene varias pruebas? ¿Podría mirar la siguiente pregunta? Stackoverflow.com/questions/54977741/…
Manu Chadha
7

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

incluida la comprensión previa que no tenía cuando comencé ...

Esto se basa principalmente en las instrucciones aquí. solo con una explicación adicional que me ayudó a hacerlo.

Mi entorno: Scala 2.10.2, SBT 0.13 e IntelliJ 13.1

Antecedentes:

  • Por alguna razón, el uso de SBT para compilar Scala en IntelliJ no está integrado de la forma en que lo están los proyectos de Maven (lo que permite la depuración con mucha facilidad).
  • Según tengo entendido, al compilar con SBT, está compilando en un proceso separado, por lo tanto, debe depurar de forma remota.

¿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 del código.
  • La herramienta de depuración que usa puede emitir comandos al motor de depuración que le dice "ejecutar la siguiente línea de código y luego pausar nuevamente" o "continuar ejecutando" u "obtener el valor de la variable almacenada aquí en la memoria".

¿Qué es la depuración remota?

  • La depuración remota está depurando a través de una conexión de red (socket).
  • Esta conexión de red le permite enviar los comandos al motor de depuración desde una máquina remota.
  • Esto es útil cuando desea depurar el código que se ejecuta 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 "habilitar depuración", incluido el puerto que se utilizará al configurar el conector de red. (sin cambios) agregue los parámetros de VM nombrados a su 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 la consola SBT (que es lo que configuró en el Paso 1). Si está ejecutando SBT fuera de IntelliJ (en la línea de comandos), deberá iniciar SBT con los mismos parámetros de VM del Paso 1 (yo no hice esto, así que no hay instrucciones). Después de este paso, SBT ahora se está ejecutando (pero su código aún no lo está) 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. Por último, inicie la compilación en SBT Console. Puede hacer esto con cualquier comando de compilación, incluido un comando de compilación continuo. Si se vuelve a compilar de forma continua, la recompilación se realizará, pero no mientras el depurador pausa la ejecución del código.
Miguel
fuente
4
el enlace está roto.
Andrew Bucknell
4

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, usando Intellij. Juntando varias sugerencias, el enfoque más simple para mí fue:

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

    addSbtPlugin ("io.spray"% "sbt-revolver"% "0.7.1")

  2. Establezca javaoptions en su archivo build.sbt:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp: transporte = dt_socket, servidor = y, suspender = y, dirección = 5005")

En particular, use la opción suspender = y. Esto mantendrá la aplicación hasta que conecte un depurador remoto de Intellij

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

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

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

  4. Desde Intellij, seleccione Run \ Debug 'Spray'. Esto debería conectarse al servidor web de la lata de aerosol. Debería poder ver muchos hilos en la ventana de depuración.

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

Herc
fuente
¡Dios te bendiga por esta respuesta! funcionó a las mil maravillas.
user2770362
3

Por lo que vale la gente de Windows, edite %SBT_HOME%\bin\sbt.baty 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 -jvm-debugcuando se ve en el lanzador de scripts Bash

NÓTESE BIEN. No creo %SBT_HOME%que exista realmente fuera de este script, a menos que lo haya creado explícitamente en su entorno, pero de todos modos entiende el punto: D

Darren Bishop
fuente
1
Solicitud de extracción combinada
Darren Bishop
3

Archivo-> Configuración-> Otras configuraciones-> Parámetros SBT VM -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005

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

Ahora en la consola SBT (iniciada en el interior por intelliJ) cuando ejecute el comando 'ejecutar' verá "Escuchando el transporte dt_socket en la dirección: 5005"

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

Utilice F7 para pasar de la siguiente línea a la siguiente

Elegí suspender para ser n. Siendo y cuando ejecuté el comando de ejecución, estaba atascado

rayfish
fuente
1
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

prueba esto

shengshan zhang
fuente
0

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 Configuración -> SBT -> Pegado debajo de la línea en el cuadro de texto Parámetros de VM:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: transporte = dt_socket, servidor = y, suspender = n, dirección = 5005

  2. Termilal abierto en IntelliJ y ejecutar:

    sbt -jvm-debug 5005

    Nota: debería ver esta línea en la terminal: "Escuchando transporte 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 Edit Configurationscuadro de lista y haga clic en Depurar .

    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. Ven a la Terminal donde ejecutas " sbt -jvm-debug 5005" y corre como se muestra a continuación

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

    Por ejemplo: com.myproject.module.AddServiceTest [Spec]

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

Dom
fuente
No funciona con Ubuntu 16.04 e IntelliJ 2017.3, el depurador se adjunta pero se ignoran los puntos de interrupción.
Jonathan Neufeld
testSuite no puede detenerse en el punto de interrupción, sin embargo, si el punto de interrupción está en un método principal, podría hacerlo.
shengshan zhang
0

El complemento AttachMe IntelliJ es una forma potencialmente más rápida de adjuntar el depurador sin tener que jugar con los números de puerto:

AttachMe adjuntará el depurador de IntelliJ automáticamente incluso si inicia su aplicación desde la terminal (o de cualquier otra forma). No es necesario activar la Attach to processacción manualmente.

La publicación del blog y el archivo Léame tienen instrucciones de configuración, sin embargo, tuve que modificarlas un poco para que funcionara en mi máquina.

  1. Descargar el installer.shscript del repositorio oficial

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Darle permisos ejecutables chmod u+x installer.sh
  3. Ejecutarlo con ./installer.sh
  4. Esto debería instalar el agente /.config/attachme/agent.jary crear un ~/.attachmearchivo
  5. Modificar ~/.attachmepara contener

    AM_JDWP_ARGS="transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    echo Using JDWP arguments ${AM_JDWP_ARGS}
    export JAVA_TOOL_OPTIONS="- javaagent:/Users/mario_galic/.config/attachme/agent.jar -agentlib:jdwp=${AM_JDWP_ARGS}"
    echo "AttachMe configured successfully"
  6. Instale el complemento Attachme correspondiente y reinicie: IntelliJ | Preferences | Plugins

  7. Crear Attachmeconfiguración de ejecución:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Después de estas travesuras únicas, podemos adjuntar un depurador automáticamente al

  1. Iniciar Attachmeconfiguración de ejecución
  2. source ~/.attachme
  3. Inicie la aplicación desde la terminal, tal vez, sbt "runMain example.Hello"
  4. El depurador debería adjuntar y detenerse automáticamente en cualquier punto de interrupción
Mario Galic
fuente
-1

Según la respuesta de Roberto Tyley anterior, pero en Windows también debemos configurar las siguientes variables de entorno después de instalar sbt:

SBT_HOME
C: \ Archivos de programa (x86) \ sbt \
[o donde esté instalado sbt]

SBT_OPTS
-Xdebug -runjdwp: transporte = dt_socket, servidor = y, suspender = n, dirección = 5005

[según el ejemplo de IntelliJ de RT]

Agregar a la ruta:% SBT_HOME% \ bin;% SBT_OPTS%

Luego ejecute lo siguiente en la línea de comando dentro de la carpeta del proyecto "sbt run -jvm -debug 5005".

Si esto funciona correctamente, la línea de comandos inicialmente generará una línea re "Escuchando transporte dt_socket en la dirección: 5005".

Establecer punto de interrupción en IntelliJ.

Abra el sitio web en el navegador para activar el punto de interrupción del depurador, por ejemplo, " http: // localhost: 9000 / ".

decdev2012
fuente