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 en utilisant le 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 pour un projet ou les tests, mais il ne semble pas y avoir de commandes pour le débogage.

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

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

Pour vous connecter à votre application exécutée dans Jetty, vous devez créer une configuration de débogage à distance. Dans ce cas, IntelliJ vous fournira un ensemble d’arguments en ligne de commande pour exécuter la JVM distante, par exemple

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

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

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

 sbt -jvm-debug 5005 

Sous les couvertures , cela lance la JVM pour SBT avec l’incantation de débogage verbeuse 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 .

Configurer IntelliJ pour se connecter au code en cours d’exécution …

Maintenant, connectez IntelliJ à votre processus en cours en utilisant une configuration Remote Debug . Notez que les 3 champs supérieurs de ce formulaire, bien que terrifiants, sont uniquement destinés à copier du texte plutôt qu’à (ils donnent l’incantation de débogage détaillé ci-dessus, que -jvm-debug prend déjà en charge pour vous) – la seule configuration que vous pouvez modifier se trouve dans la section Settings mi-chemin:

Configuration du débogage distant dans IntelliJ

J’ai eu quelques problèmes avec cela aussi, 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 à l’exécution> Modifier les configurations
    • Cliquez sur l’icône [+] et choisissez Serveur de compilation Scala.
    • Entrez le nom que vous voulez et cochez la case “Exécuter l’action SBT” et sélectionnez le jeton d’action SBT […]
  2. Créer une configuration de débogage pour le débogage à distance

    • Aller à l’exécution> Modifier les configurations
    • Cliquez sur l’icône [+] et choisissez Remote
    • Entrez le nom de votre -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 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. Configurez le plug-in sbt pour exécuter les options 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 des parameters de la machine virtuelle, après ceux qui existent déjà

Débogage

  1. Définissez les points d’arrêt comme vous le souhaitez
  2. Démarrez le serveur Web de jetée en choisissant la configuration sbt jetty-run que vous avez créée ci-dessus et en choisissant 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 distante que vous avez créée ci-dessus et en choisissant Exécuter> Déboguer ou en cliquant sur l’icône de bogue.

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 j’exécute généralement une suite en utilisant la commande ‘test-only’ de sbt. Maintenant, quand je veux utiliser le débogueur interactif, je peux faire ce qui suit:

Créez une nouvelle configuration d’exécution / débogage de type ‘ScalaTest’, placez le nom principal de la “Classe de test:” et choisissez “Avant le lancement: exécutez l’action SBT ‘test-comstack'”. Ça y est, vous pouvez maintenant placer des points d’arrêt dans les sources de test et exécuter cette configuration.

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 des explications supplémentaires qui m’ont permis de le parcourir.

Mon environnement: Scala 2.10.2, SBT 0.13 et IntelliJ 13.1

Contexte:

  • Pour quelque raison que ce soit, l’utilisation de SBT pour comstackr Scala dans IntelliJ n’est pas intégrée à celle des projets Maven (ce qui permet un débogage très facile).
  • D’après ce que j’ai compris, lorsque vous comstackz avec SBT, vous comstackz dans un processus distinct, vous devez donc procéder à un débogage à distance.

Qu’est-ce que le débogage?

  • Le débogage est un mode que vous pouvez exécuter sur votre JVM ou application pour contrôler le stream d’exécution du code.
  • L’outil de débogage que vous utilisez peut alors envoyer des commandes au moteur de débogage qui lui indique “exécuter la ligne de code suivante, puis suspendre à nouveau” ou “continuer à exécuter” ou “récupérer la valeur de la variable stockée en mémoire”.

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

  • Le débogage à distance consiste à déboguer sur une connexion réseau (socket).
  • Cette connexion réseau vous permet d’envoyer les commandes au moteur de débogage à partir d’une machine distante.
  • Ceci est utile lorsque vous souhaitez déboguer du code exécuté sur un serveur distant, MAIS
  • Il est également utile pour les situations comme le code Scala s’exécutant sous SBT et le lancement via un serveur Web, tel que Jetty ou Tomcat, distinct de votre environnement IntelliJ.

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

  1. Installez IntelliJ pour lancer SBT avec les parameters JVM “enable debugging”, y compris le port à utiliser lors de la configuration du socket réseau. (inchangé) ajoutez les parameters de la VM nommés à vos parameters IntelliJ.
  2. Assurez-vous que votre numéro de port correspond à vos parameters JVM à l’étape 1.
  3. Lorsque vous lancez SBT, vous devez le faire depuis le plug-in de la console SBT (ce que vous avez configuré à l’étape 1). Si vous exécutez SBT en dehors d’IntelliJ (sur la ligne de commande), vous devrez lancer SBT avec les mêmes parameters de VM à partir de l’étape 1 (je ne l’ai pas fait, donc pas d’instructions). Après cette étape, SBT est en cours d’exécution (mais votre code n’est pas encore) et la JVM est configurée pour le débogage à distance.
  4. Cela démarre l’outil de débogage IntelliJ, qui se connecte à la JVM que vous avez démarrée à l’étape 3.
  5. Enfin, vous lancez 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 pendant l’exécution du code par le débogueur.

Celui-ci fonctionne pour moi à chaque fois, et la seule chose que vous devez configurer est le débogage à distance dans IntelliJ; Je démarre SBT avec les parameters JVM du terminal dans IntelliJ:

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

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

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

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

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

    addSbtPlugin (“io.spray”% “sbt-revolver”% “0.7.1”)

  2. Définissez les options java dans votre fichier build.sbt:

    javaOptions: = Seq (“- Xdebug”, “-Xrunjdwp: transport = dt_socket, serveur = y, suspend = y, adresse = 5005”)

En particulier, utilisez l’option suspend = y. Cela tiendra 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 Exécuter / Modifier les configurations. Appuyez sur le bouton +, sélectionnez l’option “Remote”. Assurez-vous que les entrées correspondent aux options Java ci-dessus, en particulier l’adresse de port 5005. Atsortingbuez à la configuration un nom tel que «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 le Run \ Debug ‘Spray’. 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. Attention, certaines des directives Get in Spray semblent être exécutées au démarrage mais pas à plusieurs resockets lors de l’appel du site Web.

Fichier-> Paramètres-> Autres parameters-> parameters de la machine virtuelle SBT -Xmx512M -XX: MaxPermSize = 256M

Exécuter-> Modifier les configurations Appuyez sur + puis sélectionnez Télécommande Appuyez sur Appliquer

Maintenant, dans la console SBT (démarré à l’intérieur par intelliJ) lorsque vous exécutez la commande ‘run’, vous verrez “Écouter pour le transport dt_socket à l’adresse: 5005”

Appuyez maintenant sur Run-> Debug. Vous verrez les menus de débogage ci-dessous activés. Il a deux tabs Debugger et Console.

Utilisez F7 pour passer de la ligne suivante à la suivante

J’ai choisi de suspendre pour être n. Avec y étant quand j’ai couru la commande d’exécution il était bloqué

Pour ce que Windows folk vaut, éditez %SBT_HOME%\bin\sbt.bat et recherchez 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 que je puisse faire est d’obtenir le même comportement pour -jvm-debug lorsqu’il est vu 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 avez compris: D

J’ai aussi eu 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, suspend = n, adresse = 5005

  2. Ouverture de Termilal dans IntelliJ et exécution:

    sbt -jvm-debug 5005

    Note: vous devriez voir cette ligne dans le terminal: “Ecoute pour le transport dt_socket à l’adresse: 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 dans la zone de liste Edit Configurations et cliquez sur Déboguer .

    Remarque: La vue de débogage doit apparaître ouverte et dans Debug Console Vous devriez pouvoir voir “Connecté à la machine virtuelle cible, adresse: '127.0.0.1:5005' , transport: ‘socket'”

  5. Mettez des points d’arrêt dans quelques cas de test dans votre classe de test.

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

     project  it:testOnly package.TestSpec 

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

  7. Vous pouvez voir le débogage démarré dans votre point d’arrêt de scénario de test.

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

essaye ça