web-dev-qa-db-fra.com

Débogage du code Scala avec simple-build-tool (sbt) et IntelliJ

Quel est le moyen le plus simple de déboguer le code Scala géré par sbt à l'aide du débogueur intégré d'IntelliJ? La documentation de "RunningSbt" du site de code Google de sbt répertorie les commandes permettant d'exécuter la classe principale d'un projet ou des tests, mais il semble n'y avoir aucune commande de débogage.

Question complémentaire: quel est le moyen le plus simple d’attacher le débogueur d’IntelliJ à Jetty lors de l’utilisation de la commande jetty-run de sbt?

110
Matthew

Pour le débogage ordinaire dans IntelliJ, vous pouvez utiliser une configuration d'exécution/de débogage d'application de la manière habituelle, que vous utilisiez ou non sbt pour compiler votre code.

Pour vous connecter à votre application exécutée dans Jetty, vous devez créer une configuration de débogage à distance. Lorsque vous le ferez, IntelliJ vous fournira un ensemble d’arguments en ligne de commande permettant d’exécuter la machine virtuelle Java distante, comme par exemple:

-Xdebug -Xrunjdwp: transport = dt_socket, serveur = y, suspendre = n, adresse = 5005

Lancez sbt avec ces arguments, puis exécutez jetty-run. Enfin, lancez votre configuration de débogage à distance dans IntelliJ. Ce fil pourrait être utile.

45
Aaron Novstrup

Il y a un drapeau -jvm-debug très pratique dans les paquets officiels SBT pour Mac, Linux et Windows . Vous pouvez utiliser le drapeau pour spécifier le port de débogage:

sbt -jvm-debug 5005

Sous les couvertures , la JVM pour SBT démarre avec l'incantation de débogage typique:

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

Vous pouvez maintenant exécuter votre code normalement, par exemple avec la commande sbt run.

Configuration d'IntelliJ pour se connecter au code en cours d'exécution ...

Vous connectez maintenant IntelliJ à votre processus en cours d'exécution à l'aide de configuration de débogage distant . Notez que les 3 champs supérieurs de ce formulaire, bien que effrayants, ne vous permettent que de copier le texte out de, plutôt que dans (ils donnent l'incantation de débogage détaillée spécifiée ci-dessus, dont -jvm-debug s'occupe déjà pour vous) - la seule configuration que vous pouvez modifier est dans la section Settings à mi-chemin:

 Remote Debug configuration in IntelliJ

165
Roberto Tyley

J'ai eu quelques problèmes avec cela aussi, alors au risque d'être trop détaillé, voici ce que j'ai fait:

INSTALLER

  1. Créer une configuration d'exécution pour sbt jetty-run

    • Aller à Exécuter> Modifier les configurations
    • Cliquez sur l'icône [+] et choisissez Scala Compilation Server.
    • Entrez le nom de votre choix, cochez la case "Exécuter l'action SBT" et sélectionnez le jeton d'action SBT dans la colonne [...]
  2. Créer une configuration de débogage pour le débogage distant

    • Aller à Exécuter> Modifier les configurations
    • Cliquez sur l'icône [+] et choisissez Télécommande.
    • Entrez le nom de votre choix et copiez la ligne -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 (assurez-vous de cliquer sur OK pour créer la configuration)
  3. Configurer le plugin sbt pour exécuter les options de vm ci-dessus

    • Allez dans Fichier> Paramètres> SBT
    • Collez la ligne -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 dans la zone de paramètres VM, après ceux qui sont déjà présents.

DÉBOGAGE

  1. Définissez les points d'arrêt comme vous le souhaitez
  2. Démarrez le serveur Web Jetty en choisissant la configuration d’exécution de la jetée sbt que vous avez créée ci-dessus, puis choisissez Exécuter> Exécuter ou en cliquant sur la flèche verte.
  3. Démarrez le débogueur distant en choisissant la configuration de débogage à distance que vous avez créée ci-dessus et en choisissant Exécuter> Débogage ou en cliquant sur l'icône de bogue.
39
Jamie Forrest

J'ajoute une autre réponse ici, car j'ai trouvé cette question lors de la recherche d'un problème connexe: Débogage des classes de test à l'aide de points d'arrêt.

J'utilise ScalaTest et je lance généralement une suite à l'aide de la commande "test-only" de sbt. Maintenant, lorsque je veux utiliser le débogueur interactif, je peux effectuer les opérations suivantes:

Créez une nouvelle configuration Exécuter/Déboguer de type 'ScalaTest', insérez le nom principal "Test Class:" et choisissez "Avant le lancement: Exécuter l'action SBT 'Compiler test'". Voilà, vous pouvez maintenant placer des points d'arrêt dans les sources de test et exécuter cette configuration.

7
0__

Celui-ci fonctionne pour moi à chaque fois et la seule chose à configurer est le débogage à distance dans IntelliJ; Je lance SBT avec les paramètres JVM du terminal dans IntelliJ:

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

Après cela, je peux démarrer le débogage à distance sur localhost: 5005

6
Erik Madsen

Aucune de ces réponses ou liens fournis n'a fonctionné pour moi, alors une fois que j'ai compris cela, j'ai pensé que je partagerais ...

y compris la compréhension de fond que je n'avais pas quand j'ai commencé ...

Ceci est basé principalement sur les instructions ici juste avec une explication supplémentaire qui m'a conduit à travers elle.

Mon environnement: Scala 2.10.2, SBT 0.13 et IntelliJ 13.1

Contexte:

  • Pour une raison quelconque, utiliser SBT pour compiler Scala dans IntelliJ n’est pas intégré comme le sont les projets Maven (qui permettent le débogage très facilement).
  • D'après ce que j'ai compris, lors de la compilation avec SBT, vous compilez dans un processus séparé. Par conséquent, vous devez effectuer un débogage à distance.

Qu'est-ce que le débogage?

  • Le débogage est un mode dans lequel vous pouvez exécuter votre machine virtuelle ou une application permettant de contrôler le flux d’exécution du code.
  • L'outil de débogage que vous utilisez peut ensuite envoyer des commandes au moteur de débogage lui indiquant "d'exécuter la ligne de code suivante, puis de nouveau suspendre", "de continuer à exécuter" ou "d'obtenir la valeur de la variable stockée ici en mémoire".

Qu'est-ce que le débogage à distance?

  • Le débogage distant est un débogage via une connexion réseau (socket).
  • Cette connexion réseau vous permet d’émettre les commandes au moteur de débogage à partir d’un ordinateur distant.
  • Ceci est utile lorsque vous souhaitez déboguer du code exécuté sur un serveur distant, MAIS
  • C'est également utile pour des situations telles que le code Scala exécuté sous SBT et lancé via un serveur Web, tel que Jetty ou Tomcat, distinct de votre environnement IntelliJ.

En se référant au lien ci-dessus, les explications/modifications suivantes sont utiles:

  1. Configurez IntelliJ pour qu'il lance SBT avec les paramètres JVM "activer le débogage", y compris le port à utiliser lors de la configuration de la prise réseau. (inchangé) ajoutez les paramètres nommés VM à vos paramètres IntelliJ.
  2. Assurez-vous que votre numéro de port correspond aux paramètres de votre machine virtuelle à l'étape 1.
  3. Lorsque vous lancez SBT, vous devez le faire à partir du plug-in Console SBT (ce que vous avez configuré à l'étape 1). Si vous utilisez SBT en dehors d'IntelliJ (sur la ligne de commande), vous devez lancer SBT avec les mêmes paramètres VM à l'étape 1 (je ne l'ai pas fait; aucune instruction). Après cette étape, SBT est maintenant en cours d'exécution (mais votre code n'est pas encore) et la machine virtuelle Java est configurée pour le débogage distant.
  4. Cela démarre l’IntelliJ Debugging Tool, qui se connecte à la machine virtuelle que vous avez démarrée à l’étape 3.
  5. Enfin, vous démarrez la compilation dans la console SBT. Vous pouvez le faire avec n'importe quelle commande de compilation, y compris une commande de compilation continue. Si la recompilation est continue, la recompilation aura lieu, mais pas tant que l'exécution du code sera suspendue par le débogueur.
5
Mike

Avec Scala 2.10 et SBT 0.12, je l’ai obtenu comme ceci: http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html

3
Tulio Domingos

Fichier-> Paramètres-> Autres paramètres-> SBT VM paramètres -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, serveur = y, suspendre = n, adresse = 5005

Exécuter-> Modifier les configurations Appuyez sur + puis sélectionnez remote Appuyez sur Appliquer

Maintenant, dans la console SBT (démarrée à l'intérieur par intelliJ) lorsque vous exécutez la commande 'run', vous verrez "Listening for transport dt_socket at address: 5005"

Maintenant, appuyez sur Run-> Debug. Vous verrez les menus de débogage ci-dessous activés. Il a deux onglets Debugger et Console.

Utilisez F7 pour passer de la ligne suivante à la suivante

J'ai choisi suspendre pour être n. Avec y étant quand j'ai exécuté la commande d'exécution, il était bloqué

3
rayfish

J'ai aussi eu du mal à déboguer sous Windows avec une application Spray-can/Akka/Scala construite avec SBT et utilisant Intellij. En combinant diverses suggestions, l’approche la plus simple pour moi a été:

  1. Assurez-vous d’avoir sbt.Revolver dans votre fichier project/plugsin.sbt, par exemple.

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

  2. Définissez javaoptions dans votre fichier build.sbt:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp: transport = dt_socket, serveur = y, suspendre = y, adresse = 5005")

En particulier, utilisez l'option susp = y. Ceci maintiendra l'application jusqu'à ce que vous connectiez un débogueur distant d'Intellij

  1. Configurez une configuration de débogueur dans Intellij via le menu Configurer Exécuter/Modifier. Appuyez sur le bouton +, sélectionnez l'option "Télécommande". Assurez-vous que les entrées correspondent aux options Java ci-dessus, en particulier l’adresse de port 5005. Donnez à la configuration un nom comme «Spray».

  2. À partir de votre console SBT, utilisez la commande re-start. Vous devriez voir l'adresse du port 5005 dans la sortie de retour.

  3. Dans Intellij, définissez vos points d'arrêt.

  4. Dans Intellij, sélectionnez "Spray" Run\Debug. Cela devrait se connecter au serveur Web de spray-can. Vous devriez pouvoir voir beaucoup de threads dans la fenêtre de débogage. 

  5. Notez que certaines des directives Get de Spray semblent être exécutées au démarrage mais pas à plusieurs reprises lors de l'appel du site Web. 

3
Herc

Pour ce que ça vaut Windows folk, éditez %SBT_HOME%\bin\sbt.bat et localisez les lignes de code suivantes:

:run

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

puis remplacez-les par ce code:

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

Le mieux est d’obtenir le même comportement pour -jvm-debug lorsqu’on le voit dans le lanceur de script Bash

NB Je ne pense pas que %SBT_HOME% existe réellement en dehors de ce script, sauf si vous avez créé explicitement dans votre environnement, mais de toute façon, vous obtenez le point: D

2
Darren Bishop
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

essaye ça

0
shengshan zhang

J'ai aussi le même problème, j'aime partager comment j'ai résolu. En passant, j'utilise Ubuntu 14.04 et IntelliJ 15.

  1. Dans Setting -> SBT -> Collé sous la ligne dans la zone de texte VM Parameters:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: transport = dt_socket, serveur = y, suspendre = n, adresse = 5005

  2. Ouvert Termilal dans IntelliJ et exécuter:

    sbt -jvm-debug 5005

    Remarque: vous devriez voir cette ligne dans le terminal: "Listening for transport dt_socket at address: 5005"

  3. Modifier les configurations -> Cliquez sur + -> Sélectionnez "Distant".

    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. Sélectionnez DebugMyModule in Edit Configurations et cliquez sur Debug .

    Remarque: Vous devriez voir la vue de débogage ouverte et dans la console de débogage. Vous devriez pouvoir voir "Connecté à la machine virtuelle cible, adresse: '127.0.0.1:5005', transport: 'socket'"

  5. Placez des points d'arrêt dans quelques cas de test de votre Testclass.

  6. Venez au Terminal où vous exécutez "sbt -jvm-debug 5005" et exécutez comme ci-dessous

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

    Par exemple: com.myproject.module.AddServiceTest [Spec]

  7. Vous pouvez voir que le débogage a commencé dans votre point d'arrêt de scénario de test.

0
Sun