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


120

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 pour exécuter la classe principale pour un projet ou les tests, mais il ne semble y avoir aucune commande pour le débogage.

Question de suivi: 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?


6
S'il vous plaît ne pas mélanger les questions à l'avenir
hennr

Réponses:


47

Pour le 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 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 faites, IntelliJ vous donnera un ensemble d'arguments de ligne de commande pour exécuter la JVM distante - quelque chose comme

-Xdebug -Xrunjdwp: transport = dt_socket, serveur = y, suspend = 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.


1
pour moi De manière habituelle ça ne marche pas bien: stackoverflow.com/questions/16337745/...
ses

Où tapez-vous ceci? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622

@ Jwan622 Lancez sbt avec ces arguments (par exemple, à partir de la ligne de commande, en les fournissant comme arguments de ligne de commande). Puis exécutez jetty-runà l'invite sbt.
Aaron Novstrup

alors viens de courir sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622

3
Pour la plupart des utilisateurs, cela devrait fonctionner, mais cela dépend de la façon dont sbt est configuré sur votre système. Comme indiqué dans l'autre réponse, vous pourrez peut-être simplement exécuter sbt -jvm-debug 5005.
Aaron Novstrup

189

Il y a un -jvm-debugdrapeau très pratique dans les packages SBT officiels 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 démarre la JVM pour SBT avec l'incantation typique de débogage verbeux:

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

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

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 d'une configuration de débogage à distance . Notez que les 3 champs supérieurs de ce formulaire, bien qu'effrayants, sont juste pour vous de copier du texte hors de, plutôt que dans (ils donnent l'incantation de débogage détaillée spécifiée ci-dessus, qui -jvm-debugprend déjà en charge pour vous) - la seule configuration vous pouvez changer est dans la Settingssection à mi-chemin:

Configuration du débogage à distance dans IntelliJ


1
Cela ne fonctionne pas sous Windows - une idée de comment faire de même sur cette (moche) plate-forme?
javadba

C'est le script de lancement que je crois utilisé pour Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Je vous encourage à trouver comment modifier le script pour accepter le -jvm-debugparamètre et à le soumettre en tant que pull request - vous avez de bonnes chances de profiter à tous ceux qui se trouvent sur la même plate-forme.
Roberto Tyley

Regardé dedans. Le script de lancement de Windows est WAY primitif vs linux. Impossible de faire maintenant.
javadba

1
Demande de tirage fusionnée ... voir ci
Darren Bishop

3
Il serait utile de savoir où insérer le "sbt -jvm 5005" dans IntelliJ
eddy147

39

J'ai eu quelques problèmes avec cela aussi, donc 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

    • Allez dans Exécuter> Modifier les configurations
    • Cliquez sur l'icône [+] et choisissez Scala Compilation Server
    • Entrez le nom de votre choix, cliquez sur la case à cocher "Exécuter SBT Action" et sélectionnez la jetty-run Action SBT à partir du [...]
  2. Créer une configuration de débogage pour le débogage à distance

    • Allez dans Exécuter> Modifier les configurations
    • Cliquez sur l'icône [+] et choisissez Remote
    • 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 vm ci-dessus

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

DÉBOGAGE

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

16
il n'y a pas de serveur de compilation Scala dans le menu Configurations. Alors ai-je besoin de quelque chose de spécial?
Arne

semble que step1 n'est pas nécessaire, ce que je fais est d'exécuter la commande sbt sbt -jvm-debug 5005 console, puis de définir le point d'arrêt dans intelllJ Idea, d'exécuter le débogage.
Pengfei.X

@ Pengfei.X, sbt -jvm-debug 5005 consolen'a pas fonctionné pour moi, mais sbt -jvm-debug 5005a fonctionné.
Lukasz Czerwinski

8

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 paramètres JVM depuis le 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


7

J'ajoute une autre réponse ici, car j'ai trouvé cette question en recherchant un problème connexe: le 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, lorsque je veux utiliser le débogueur interactif, je peux faire ce qui suit:

Créez une nouvelle configuration Run / Debug de type 'ScalaTest', mettez le nom principal "Test Class:" et choisissez "Before launch: Run SBT Action 'test-compile'". Voilà, vous pouvez maintenant placer des points d'arrêt dans les sources de test et exécuter cette configuration.


idem, mais ne fonctionne pas bien: stackoverflow.com/questions/16337745/…
ses

savez-vous comment je peux exécuter un seul test si la classe de test comporte plusieurs tests? Pourriez-vous s'il vous plaît regarder la question suivante stackoverflow.com/questions/54977741/…
Manu Chadha

7

Aucune de ces réponses ou liens fournis n'a fonctionné pour moi, donc 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 avec des explications supplémentaires qui m'ont guidé.

Mon environnement: Scala 2.10.2, SBT 0.13 et IntelliJ 13.1

Contexte:

  • Pour une raison quelconque, l'utilisation de SBT pour compiler Scala dans IntelliJ n'est pas intégrée 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 déboguer à distance.

Qu'est-ce que le débogage?

  • Le débogage est un mode dans lequel vous pouvez exécuter votre JVM ou votre application et qui vous permet de contrôler le flux d'exécution du code.
  • L'outil de débogage que vous utilisez peut alors émettre des commandes au moteur de débogage qui lui indiquent «exécuter la prochaine ligne de code puis faire une nouvelle pause» ou «continuer l'exécution» ou «obtenir la valeur de la variable stockée ici en mémoire».

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

  • Le débogage à distance est le débogage via une connexion réseau (socket).
  • Cette connexion réseau vous permet d'émettre les commandes vers le moteur de débogage à partir d'une machine distante.
  • Ceci est utile lorsque vous souhaitez déboguer du code qui s'exécute 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 référence au lien ci-dessus, les explications / modifications suivantes sont utiles:

  1. Configurez IntelliJ pour lancer SBT avec les paramètres JVM «activer le débogage», y compris le port à utiliser lors de la configuration du socket réseau. (inchangé) ajoutez les paramètres VM nommés à vos paramètres IntelliJ.
  2. Assurez-vous que votre numéro de port correspond ici à vos paramètres JVM de l'étape 1.
  3. Lorsque vous lancez SBT, vous devez le faire à partir du plugin SBT Console (qui est ce que vous avez configuré à l'étape 1). Si vous exécutez SBT en dehors d'IntelliJ (au niveau de la ligne de commande), vous devrez lancer SBT avec les mêmes paramètres VM à partir de l'étape 1 (je ne l'ai pas fait; donc pas d'instructions). Après cette étape, SBT est maintenant en cours d'exécution (mais votre code ne l'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 machine virtuelle Java 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 continue, la recompilation se produira, mais pas tant que l'exécution du code est suspendue par le débogueur.

4
le lien est rompu.
Andrew Bucknell

4

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

  1. Assurez-vous que vous avez 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, server = y, suspend = y, address = 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 du port 5005. Donnez à la configuration un nom comme «Spray».

  2. Depuis 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. Depuis Intellij, sélectionnez Run \ Debug 'Spray'. Cela devrait se connecter au serveur Web du spray-can. Vous devriez pouvoir voir beaucoup de threads dans la fenêtre de débogage.

  5. Sachez 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.


vous bénisse pour cette réponse! a fonctionné comme un charme.
user2770362


3

Pour ce que cela vaut pour Windows, modifiez %SBT_HOME%\bin\sbt.batet 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 que je puisse faire pour avoir le même comportement -jvm-debug lorsque vu dans le lanceur de script Bash

NB. Je ne pense pas qu'il %SBT_HOME%existe réellement en dehors de ce script, à moins que vous ne l'ayez créé explicitement dans votre environnement, mais de toute façon vous comprenez: D


1
Demande de tirage fusionnée
Darren Bishop

3

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

Exécuter-> Modifier les configurations Appuyez sur + puis sélectionnez la 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 "Écoute du transport dt_socket à l'adresse: 5005"

Maintenant, appuyez sur Exécuter-> Déboguer. 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 de suspendre pour être n. Avec ça, quand j'ai exécuté la commande run, c'était bloqué


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

essaye ça


0

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

  1. Dans Paramètres -> SBT -> Collé sous la ligne dans la zone de texte Paramètres VM:

    -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

    Remarque: vous devriez voir cette ligne dans le terminal: "Écoute du transport dt_socket à l'adresse: 5005"

  3. Modifier les configurations -> Cliquez sur + -> Sélectionnez 'À distance'

    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 Edit Configurationsliste et cliquez sur Déboguer .

    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. Mettez des points d'arrêt dans quelques cas de test dans votre classe de test.

  6. Accédez 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 le débogage démarré dans votre point d'arrêt de scénario de test.


Ne fonctionne pas avec Ubuntu 16.04 et IntelliJ 2017.3, le débogueur s'attache mais les points d'arrêt sont ignorés.
Jonathan Neufeld

testSuite ne peut pas s'arrêter au point d'arrêt, cependant si le point d'arrêt est dans une méthode principale, il le pourrait.
shengshan zhang

0

Le plugin AttachMe IntelliJ est un moyen potentiellement plus rapide d'attacher le débogueur sans avoir à manipuler les numéros de port:

AttachMe attachera automatiquement le débogueur IntelliJ même si vous démarrez votre application à partir du terminal (ou de toute autre manière). Vous n'avez pas besoin de déclencher une Attach to processaction manuellement.

Le blog et le fichier Lisez -moi ont des instructions de configuration, mais j'ai dû les modifier un peu pour que cela fonctionne sur ma machine

  1. Télécharger le installer.shscript depuis le dépôt officiel

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Donnez-lui des autorisations exécutables chmod u+x installer.sh
  3. Exécutez-le avec ./installer.sh
  4. Cela devrait installer l'agent sous /.config/attachme/agent.jaret créer un ~/.attachmefichier
  5. Modifier ~/.attachmepour contenir

    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. Installez le plugin Attachme correspondant et redémarrez: IntelliJ | Preferences | Plugins

  7. Créer Attachmeune configuration d'exécution:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Après ces manigances ponctuelles, nous pouvons attacher automatiquement un débogueur en

  1. Démarrer la Attachmeconfiguration de l'exécution
  2. source ~/.attachme
  3. Démarrer l'application à partir du terminal, peut-être, sbt "runMain example.Hello"
  4. Le débogueur doit automatiquement attacher et s'arrêter à tout point d'arrêt

-1

Selon la réponse de Roberto Tyley ci-dessus, mais sous Windows, nous devons également définir les variables d'environnement suivantes après l'installation de sbt:

SBT_HOME
C: \ Program Files (x86) \ sbt \
[ou partout où sbt est installé]

SBT_OPTS
-Xdebug -runjdwp: transport = dt_socket, serveur = y, suspend = n, adresse = 5005

[par exemple IntelliJ de RT]

Ajouter au chemin:% SBT_HOME% \ bin;% SBT_OPTS%

Exécutez ensuite ce qui suit dans la ligne de commande dans le dossier du projet "sbt run -jvm -debug 5005".

Si cela fonctionne correctement, la ligne de commande affichera initialement une ligne re "Écoute du transport dt_socket à l'adresse: 5005".

Définissez le point d'arrêt dans IntelliJ.

Ouvrez le site Web dans le navigateur pour déclencher le point d'arrêt du débogueur, par exemple " http: // localhost: 9000 / ".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.