wake-up-neo.com

Debuggen von Scala-Code mit Simple-Build-Tool (sbt) und IntelliJ

Was ist der einfachste Weg zum Debuggen von Scala-Code, der von sbt mit dem integrierten Debugger von IntelliJ verwaltet wird? Die Dokumentation von "RunningSbt" von sbt's google code site listet Befehle zum Ausführen der Hauptklasse für ein Projekt oder die Tests auf, aber es scheint keine Befehle zum Debuggen zu geben.

Folgefrage: Was ist der einfachste Weg, um den IntelliJ-Debugger an Jetty anzuschließen, wenn Sie den Jetty-Run-Befehl von sbt verwenden?

110
Matthew

Für das normale Debuggen in IntelliJ können Sie eine Application Run/Debug-Konfiguration auf die übliche Weise verwenden, unabhängig davon, ob Sie sbt zum Kompilieren Ihres Codes verwenden.

Um eine Verbindung zu Ihrer Anwendung herzustellen, die in Jetty ausgeführt wird, müssen Sie eine Remote-Debug-Konfiguration erstellen. Wenn Sie dies tun, gibt Ihnen IntelliJ eine Reihe von Befehlszeilenargumenten zum Ausführen der fernen JVM - so etwas wie

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

Starten Sie sbt mit diesen Argumenten und führen Sie dann jetty-run aus. Starten Sie abschließend Ihre Remote-Debug-Konfiguration in IntelliJ. Dieser Thread könnte nützlich sein.

45
Aaron Novstrup

In den offiziellen SBT-Paketen für Mac, Linux & Windows gibt es ein sehr bequemes -jvm-debug - Flag. Sie können das Flag verwenden, um den Debug-Port anzugeben:

sbt -jvm-debug 5005

Unter den Covers wird die JVM für SBT mit der typischen ausführlichen Debugging-Beschwörung gestartet:

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

Sie können Ihren Code jetzt wie gewohnt ausführen, beispielsweise mit dem Befehl sbt run.

IntelliJ für die Verbindung zum laufenden Code konfigurieren ...

Jetzt verbinden Sie IntelliJ mit Ihrem laufenden Prozess mit einer Remote Debug-Konfiguration . Beachten Sie, dass die oberen 3 Felder in diesem Formular, während Sie beängstigend sind, nur zum Kopieren von Text out aus, statt in verwendet werden (sie geben die oben angegebene ausführliche Debugging-Beschwörung vor, für die -jvm-debug bereits sorgt ) - Die einzige Konfiguration, die Sie ändern können, befindet sich in der Hälfte der VariablenSettings:

 Remote Debug configuration in IntelliJ

165
Roberto Tyley

Ich hatte auch ein paar Probleme damit, also mit der Gefahr, zu detailliert zu sein, habe ich Folgendes getan:

KONFIGURATION

  1. Erstellen Sie eine Laufkonfiguration für sbt jetty-run

    • Gehen Sie zu "Ausführen"> "Konfigurationen bearbeiten"
    • Klicken Sie auf das Symbol [+] und wählen Sie Scala Compilation Server
    • Geben Sie den gewünschten Namen ein und klicken Sie auf das Kontrollkästchen "SBT-Aktion ausführen". Wählen Sie aus dem [...]
  2. Erstellen Sie eine Debug-Konfiguration für das Remote-Debugging

    • Gehen Sie zu "Ausführen"> "Konfigurationen bearbeiten"
    • Klicken Sie auf das Symbol [+] und wählen Sie Remote
    • Geben Sie den gewünschten Namen ein und kopieren Sie die Zeile -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 (vergewissern Sie sich, dass Sie auf OK klicken, um die Konfiguration zu erstellen.)
  3. Richten Sie das sbt-Plugin ein, um die oben genannten vm-Optionen auszuführen

    • Gehen Sie zu Datei> Einstellungen> SBT
    • Fügen Sie die Zeile -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 im Parameterfeld VM nach den bereits vorhandenen ein

DEBUGGEN

  1. Legen Sie die Haltepunkte wie gewünscht fest
  2. Starten Sie den Jetty-Webserver, indem Sie die oben erstellte sbt-Jetty-Run-Konfiguration auswählen und Ausführen> Ausführen wählen, oder klicken Sie auf den grünen Pfeil
  3. Starten Sie den Remote-Debugger, indem Sie die Remote-Debugging-Konfiguration auswählen, die Sie oben erstellt haben, und wählen Sie Ausführen> Debuggen oder klicken Sie auf das Fehlersymbol
39
Jamie Forrest

Ich füge hier eine weitere Antwort hinzu, weil ich diese Frage beim Nachschlagen eines verwandten Problems gefunden habe: Debuggen von Testklassen mithilfe von Haltepunkten.

Ich verwende ScalaTest und führe normalerweise eine Suite mit dem Befehl 'test-only' von sbt aus. Wenn ich nun den interaktiven Debugger verwenden möchte, kann ich Folgendes tun:

Erstellen Sie eine neue Run/Debug-Konfiguration des Typs 'ScalaTest', geben Sie den Hauptnamen "Test Class:" ein und wählen Sie "Vor dem Start: SBT-Aktion 'Testkompilieren'". Das ist es, Sie können jetzt Haltepunkte in den Testquellen platzieren und diese Konfiguration ausführen.

7
0__

Dies funktioniert jedes Mal für mich und das einzige, was Sie einrichten müssen, ist das Remote-Debugging in IntelliJ. Ich starte SBT mit JVM-Parametern vom Terminal in IntelliJ aus:

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

Danach kann ich das Remote-Debugging auf localhost: 5005 starten

6
Erik Madsen

Keine dieser Antworten oder Links lieferte für mich, und als ich das herausgefunden hatte, dachte ich, ich würde es teilen ...

einschließlich des Hintergrundverständnisses, das ich nicht hatte, als ich anfing ...

Dies basiert hauptsächlich auf den Anweisungen hier nur mit zusätzlicher Erklärung, die mich durchbrachten.

Meine Umgebung: Scala 2.10.2, SBT 0.13 und IntelliJ 13.1

Hintergrund:

  • Aus irgendeinem Grund ist die Verwendung von SBT zum Kompilieren von Scala in IntelliJ nicht so integriert wie Maven-Projekte (die das Debuggen sehr einfach ermöglichen).
  • Aus meinem Verständnis geht hervor, dass Sie beim Kompilieren mit SBT in einem separaten Prozess kompilieren. Daher müssen Sie aus der Ferne debuggen.

Was ist Debuggen?

  • Debugging ist ein Modus, in dem Sie Ihre JVM oder App ausführen können, um den Fluss der Codeausführung zu steuern.
  • Das von Ihnen verwendete Debugging-Tool kann dann Befehle an die Debugging-Engine ausgeben, in der es "die nächste Codezeile ausführen, dann erneut anhalten" oder "die Ausführung fortsetzen" oder "den Wert der hier im Speicher gespeicherten Variablen abrufen" soll.

Was ist Remote Debugging?

  • Remote-Debugging ist das Debuggen über eine Netzwerkverbindung (Socket).
  • Mit dieser Netzwerkverbindung können Sie die Befehle von einem Remote-Computer an die Debug Engine ausgeben.
  • Dies ist nützlich, wenn Sie Code debuggen möchten, der auf einem Remote-Server ausgeführt wird, ABER
  • Dies ist auch nützlich für Situationen wie Scala-Code, der unter SBT ausgeführt wird und über einen Webserver wie Jetty oder Tomcat getrennt von Ihrer IntelliJ-Umgebung gestartet wird.

Unter Bezugnahme auf den obigen Link sind die folgenden Erklärungen/Modifikationen hilfreich:

  1. Richten Sie IntelliJ ein, um SBT mit den JVM-Einstellungen "Debugging aktivieren" zu starten, einschließlich des Ports, der beim Einrichten des Netzwerk-Sockets verwendet werden soll. (unverändert) Fügen Sie den IntelliJ-Einstellungen die benannten VM -Parameter hinzu.
  2. Stellen Sie sicher, dass Ihre Portnummer hier Ihren JVM-Einstellungen aus Schritt 1 entspricht.
  3. Wenn Sie SBT starten, müssen Sie dies über das Plugin für SBT-Konsole tun (dies haben Sie in Schritt 1 konfiguriert). Wenn Sie SBT außerhalb von IntelliJ (an der Befehlszeile) ausführen, müssen Sie SBT mit den gleichen VM - Parametern von Schritt 1 aus starten (ich habe dies nicht getan, daher keine Anweisungen). Nach diesem Schritt wird SBT jetzt ausgeführt (aber Ihr Code ist noch nicht), und die JVM ist für das Remote-Debugging eingerichtet.
  4. Dadurch wird das IntelliJ Debugging Tool gestartet, das eine Verbindung zu der in Schritt 3 gestarteten JVM herstellt.
  5. Zum Schluss starten Sie die Zusammenstellung in der SBT Console. Sie können dies mit jedem Kompilierungsbefehl einschließlich eines fortlaufenden Kompilierungsbefehls tun. Bei fortlaufender Neukompilierung wird die Neukompilierung ausgeführt, jedoch nicht, wenn die Codeausführung vom Debugger angehalten wird.
5
Mike
3
Tulio Domingos

Datei-> Einstellungen-> Andere Einstellungen-> SBT VM Parameter -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, Adresse = 5005

Run-> Edit Konfigurationen Drücken Sie + und wählen Sie dann die Fernbedienung aus Klicken Sie auf Übernehmen

Wenn Sie nun in der SBT-Konsole (Started by intelliJ) den Befehl 'run' ausführen, sehen Sie "Transport dt_socket auf Adresse überwachen: 5005".

Drücken Sie nun Run-> Debug. Die Debugmenüs werden unten aktiviert. Es hat zwei Registerkarten Debugger und Konsole.

Verwenden Sie F7 zur nächsten Zeile

Ich entschied mich für suspend n zu sein. Da es y war, als ich den Run-Befehl ausführte, steckte es fest

3
rayfish

Ich habe auch mit dem Debuggen unter Windows zu kämpfen, mit einer über SBT erstellten Spray-can/Akka/Scala-App unter Verwendung von Intellij. Verschiedene Vorschläge zusammenzustellen, war der einfachste Ansatz für mich:

  1. Stellen Sie sicher, dass Sie sbt.Revolver in Ihrer Datei project/plugsin.sbt haben, z.

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

  2. Legen Sie Javaoptions in Ihrer build.sbt-Datei fest:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp: transport = dt_socket, Server = y, Suspend = y, Adresse = 5005")

Verwenden Sie insbesondere die Option suspend = y. Dies hält die App an, bis Sie einen Remote-Debugger von Intellij verbinden

  1. Richten Sie eine Debugger-Konfiguration in Intellij über das Menü Run/Edit Configurations ein. Drücken Sie die + Taste und wählen Sie die Option "Remote". Stellen Sie sicher, dass die Einträge mit den obigen Java-Optionen übereinstimmen, insbesondere mit der Port-Adresse 5005. Geben Sie der Konfiguration einen Namen wie 'Spray'.

  2. Verwenden Sie von Ihrer SBT-Konsole den Neustartbefehl. Sie sollten die 5005-Portadresse in der Rückmeldungsausgabe sehen.

  3. In Intellij legen Sie Ihre Haltepunkte fest.

  4. Wählen Sie in Intellij den Befehl Run\Debug 'Spray'. Dies sollte eine Verbindung zum Spray-Can-Webserver herstellen. Sie sollten in der Lage sein, viele Threads im Debug-Fenster zu sehen. 

  5. Beachten Sie, dass einige der Get-Direktiven in Spray beim Start ausgeführt werden, beim Aufruf der Website jedoch nicht wiederholt werden. 

3
Herc

Bearbeiten Sie %SBT_HOME%\bin\sbt.bat und suchen Sie nach den folgenden Codezeilen:

:run

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

dann ersetzen Sie sie durch diesen 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

Am besten kann ich dasselbe Verhalten für -jvm-debug erzielen, wenn es im Bash-Skript-Launcher angezeigt wird

NB. Ich glaube nicht, dass %SBT_HOME% tatsächlich außerhalb dieses Skripts existiert, es sei denn, Sie haben explizit in Ihrer Umgebung erstellt, aber Sie haben trotzdem den Punkt: D

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

versuche dies

0
shengshan zhang

Ich habe auch das gleiche Problem, ich teile gerne mit, wie ich es gelöst habe. Übrigens verwende ich Ubuntu 14.04 und IntelliJ 15.

  1. In Einstellung -> SBT -> Unterhalb der Zeile in das Textfeld VM eingefügt:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: Transport = dt_socket, Server = y, Suspend = n, Adresse = 5005

  2. Termilal in IntelliJ eröffnet und ausführen:

    sbt -jvm-debug 5005

    Hinweis: Sie sollten diese Zeile im Terminal sehen: "Auf Transport dt_socket an Adresse: 5005 warten"

  3. Konfigurationen bearbeiten -> Klick + -> 'Remote' auswählen

    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. Wählen Sie DebugMyModule im Listenfeld Edit Configurations aus und klicken Sie auf Debug .

    Hinweis: Sie sollten die Debug-Ansicht geöffnet sehen und in der Debug-Konsole sehen. Sie sollten "Verbunden mit der Ziel-VM, Adresse: '127.0.0.1:5005', transport: 'socket'"

  5. Setzen Sie in wenigen Testfällen Haltepunkte in Ihre Testklasse.

  6. Kommen Sie zu Terminal, wo Sie "sbt -jvm-debug 5005" ausführen und wie unten beschrieben ausführen

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

    Zum Beispiel: com.myproject.module.AddServiceTest [Spec]

  7. In Ihrem Testfall-Haltepunkt kann Debug gestartet werden.

0
Sun