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

120

Was ist der einfachste Weg, um von sbt verwalteten Scala-Code mit dem in IntelliJ integrierten Debugger zu debuggen? In der Dokumentation von "RunningSbt" von der Google-Code-Site von sbt sind Befehle zum Ausführen der Hauptklasse für ein Projekt oder die Tests aufgeführt. Es scheint jedoch keine Befehle zum Debuggen zu geben.

Folgefrage: Was ist der einfachste Weg, den IntelliJ-Debugger an Jetty anzuhängen, wenn Sie den Befehl jbt-run von sbt verwenden?

Matthew
quelle
6
Bitte mischen Sie keine Fragen in der Zukunft
hennr

Antworten:

47

Für das normale Debuggen in IntelliJ können Sie eine Anwendungsausführungs- / 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 Remote-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 es aus jetty-run. Starten Sie abschließend Ihre Remote-Debug-Konfiguration in IntelliJ. Dieser Thread könnte nützlich sein.

Aaron Novstrup
quelle
1
für mich in gewohnter Weise funktioniert es nicht gut: stackoverflow.com/questions/16337745/...
ses
Wo tippst du das? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622
@ Jwan622 Starten Sie sbt mit diesen Argumenten (z. B. über die Befehlszeile und geben Sie diese als Befehlszeilenargumente an). jetty-runFühren Sie dann an der Eingabeaufforderung sbt aus.
Aaron Novstrup
also einfach rennen sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622
3
Für die meisten Benutzer sollte das funktionieren, aber es hängt davon ab, wie sbt auf Ihrem System eingerichtet ist. Wie in der anderen Antwort angegeben, können Sie möglicherweise einfach ausführen sbt -jvm-debug 5005.
Aaron Novstrup
189

-jvm-debugIn den offiziellen SBT-Paketen für Mac, Linux und Windows gibt es eine sehr praktische Flagge . Mit dem Flag können Sie den Debug-Port angeben:

sbt -jvm-debug 5005

Unter dem Deckmantel startet dies die JVM für SBT mit der typischen ausführlichen Debugging-Beschwörung:

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

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

Konfigurieren von IntelliJ für die Verbindung mit dem laufenden Code ...

Jetzt verbinden Sie IntelliJ mithilfe einer Remote-Debug-Konfiguration mit Ihrem laufenden Prozess . Beachten Sie, dass die oberen drei Felder in diesem Formular zwar beängstigend sind, aber nur zum Kopieren von Text und nicht zum Kopieren dienen (sie geben die oben angegebene ausführliche Beschwörungsbeschwörung an, die sich -jvm-debugbereits um Sie kümmert) - die einzige Konfiguration Sie können ändern, ist in dem SettingsAbschnitt auf halber Höhe:

Remote-Debug-Konfiguration in IntelliJ

Roberto Tyley
quelle
1
Dies funktioniert unter Windows nicht - gibt es eine Idee, wie man auf dieser (miesen) Plattform ähnlich vorgeht?
Javadba
Dies ist das Launcher-Skript, von dem ich glaube, dass es für Windows verwendet wird: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Ich möchte Sie ermutigen, herauszufinden, wie Sie das Skript ändern können, um den -jvm-debugParameter zu akzeptieren , und dies als Pull-Anfrage einzureichen. Sie haben gute Chancen, allen zu helfen, die sich auf derselben Plattform befinden.
Roberto Tyley
Sah hinein. Das Windows-Startskript ist WAY primitiv gegenüber Linux. Kann jetzt nicht machen.
Javadba
1
Pull-Anfrage zusammengeführt ... siehe unten
Darren Bishop
3
Es wäre hilfreich zu wissen, wo die "sbt -jvm 5005" in IntelliJ
eddy147
39

Ich hatte auch einige Probleme damit. Auf die Gefahr hin, zu detailliert zu werden, habe ich Folgendes getan:

KONFIGURATION

  1. Erstellen Sie eine Ausführungskonfiguration 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 einen beliebigen Namen ein, aktivieren Sie das Kontrollkästchen "SBT-Aktion ausführen" und wählen Sie den SBT-Aktionssteg aus [...]
  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(klicken Sie auf OK, um die Konfiguration tatsächlich 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=5005in das Feld VM-Parameter nach den bereits vorhandenen ein

DEBUGGING

  1. Stellen Sie die gewünschten Haltepunkte ein
  2. Starten Sie den Jetty-Webserver, indem Sie die oben erstellte sbt-Jetty-Run-Konfiguration auswählen und Ausführen> Ausführen auswählen oder auf den grünen Pfeil klicken
  3. Starten Sie den Remote-Debugger, indem Sie die oben erstellte Remote-Debugging-Konfiguration auswählen und Ausführen> Debuggen wählen oder auf das Fehlersymbol klicken
Jamie Forrest
quelle
16
Im Konfigurationsmenü befindet sich kein Scala Compilation Server. Brauche ich etwas Besonderes?
Arne
Anscheinend ist Schritt 1 nicht erforderlich. Ich führe den Befehl sbt aus sbt -jvm-debug 5005 console, setze dann den Haltepunkt in der intelligenten Idee und führe das Debuggen aus.
Pengfei.X
@ Pengfei.X, sbt -jvm-debug 5005 consolehat bei mir nicht funktioniert, aber sbt -jvm-debug 5005funktioniert.
Lukasz Czerwinski
8

Dieser 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:

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

Danach kann ich mit dem Remote-Debugging auf localhost: 5005 beginnen

Erik Madsen
quelle
7

Ich füge hier eine weitere Antwort hinzu, da 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 jetzt den interaktiven Debugger verwenden möchte, kann ich Folgendes tun:

Erstellen Sie eine neue Run / Debug-Konfiguration vom Typ 'ScalaTest', geben Sie den Hauptnamen "Test Class:" ein und wählen Sie "Vor dem Start: SBT-Aktion 'test-compile' ausführen". Das war's, Sie können jetzt Haltepunkte in den Testquellen platzieren und diese Konfiguration ausführen.

0__
quelle
das gleiche, aber funktioniert nicht gut: stackoverflow.com/questions/16337745/…
ses
Wissen Sie, wie ich nur einen Test ausführen kann, wenn die Testklasse mehrere Tests enthält? Könnten Sie sich bitte die folgende Frage ansehen stackoverflow.com/questions/54977741/…
Manu Chadha
7

Keine dieser Antworten oder bereitgestellten Links funktionierte für mich. Sobald ich das herausgefunden hatte, dachte ich, ich würde ...

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

Dies basiert hauptsächlich auf den Anweisungen hier, nur mit zusätzlichen Erklärungen, die mich durch die Anweisungen geführt haben .

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).
  • Nach meinem Verständnis müssen Sie beim Kompilieren mit SBT in einem separaten Prozess kompilieren. Daher müssen Sie ein Remote-Debugging durchführen.

Was ist Debugging?

  • Das Debuggen ist ein Modus, in dem Sie Ihre JVM oder App ausführen können, um den Ablauf der Codeausführung zu steuern.
  • Das von Ihnen verwendete Debugging-Tool kann dann Befehle an die Debugging-Engine senden, die besagt, dass "die nächste Codezeile ausführen und dann erneut pausieren" 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).
  • Über diese Netzwerkverbindung können Sie die Befehle von einem Remotecomputer an die Debug Engine senden.
  • 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 gestartet wird, der von Ihrer IntelliJ-Umgebung getrennt ist.

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

  1. Richten Sie IntelliJ so ein, dass SBT mit den JVM-Einstellungen "Debugging aktivieren" gestartet wird, einschließlich des Ports, der beim Einrichten des Netzwerk-Sockets verwendet werden soll. (unverändert) Fügen Sie die benannten VM-Parameter zu Ihren IntelliJ-Einstellungen hinzu.
  2. Stellen Sie sicher, dass Ihre Portnummer hier mit Ihren JVM-Einstellungen aus Schritt 1 übereinstimmt.
  3. Wenn Sie SBT starten, müssen Sie dies über das SBT Console-Plugin tun (was Sie in Schritt 1 konfiguriert haben). Wenn Sie SBT außerhalb von IntelliJ ausführen (über die Befehlszeile), müssen Sie SBT mit denselben VM-Parametern aus Schritt 1 starten (ich habe dies nicht getan; also keine Anweisungen). Nach diesem Schritt wird SBT jetzt ausgeführt (Ihr Code ist jedoch noch nicht vorhanden) 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. Schließlich starten Sie die Kompilierung in der SBT-Konsole. Sie können dies mit jedem Kompilierungsbefehl tun, einschließlich eines kontinuierlichen Kompilierungsbefehls. Bei kontinuierlicher Neukompilierung erfolgt die Neukompilierung, jedoch nicht, während die Codeausführung vom Debugger angehalten wird.
Mike
quelle
4
Link ist defekt.
Andrew Bucknell
4

Ich habe Probleme mit dem Debuggen unter Windows mit einer Spray-can / Akka / Scala-App, die über SBT mit Intellij erstellt wurde. Der einfachste Ansatz für mich war, verschiedene Vorschläge zusammenzusetzen:

  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, address = 5005")

Verwenden Sie insbesondere die Option suspend = y. Dadurch bleibt die App erhalten, bis Sie einen Remote-Debugger von Intellij aus verbinden

  1. Richten Sie eine Debugger-Konfiguration in Intellij über das Menü Konfigurationen ausführen / bearbeiten ein. Drücken Sie die Taste + und wählen Sie die Option "Remote". Stellen Sie sicher, dass die Einträge mit den oben genannten Java-Optionen übereinstimmen, insbesondere mit der Portadresse von 5005. Geben Sie der Konfiguration einen Namen wie 'Spray'.

  2. Verwenden Sie auf Ihrer SBT-Konsole den Befehl zum Neustart. Die 5005-Portadresse sollte im Feedback-Ausgang angezeigt werden.

  3. Setzen Sie in Intellij Ihre Haltepunkte.

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

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

Herc
quelle
segne dich für diese Antwort! arbeitete wie Charme.
user2770362
3

Bearbeiten %SBT_HOME%\bin\sbt.batund suchen Sie die folgenden Codezeilen , um Windows-Benutzer zu unterstützen :

:run

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

Ersetzen Sie sie dann 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

Das Beste, was ich tun kann, um das gleiche Verhalten zu erzielen, -jvm-debugwenn es im Bash-Skriptstarter angezeigt wird

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

Darren Bishop
quelle
1
Pull-Anfrage zusammengeführt
Darren Bishop
3

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

Ausführen-> Konfigurationen bearbeiten Drücken Sie + und wählen Sie dann Remote. Drücken Sie Übernehmen

Wenn Sie jetzt in der SBT-Konsole (von IntelliJ gestartet) den Befehl 'run' ausführen, wird "Auf Transport dt_socket unter der Adresse 5005 warten" angezeigt.

Drücken Sie nun Run-> Debug. Sie sehen die Debug-Menüs unten aktiviert. Es hat zwei Registerkarten Debugger und Konsole.

Verwenden Sie F7, um von der nächsten Zeile zur nächsten zu gelangen

Ich habe suspend gewählt, um n zu sein. Als ich den Befehl run ausführte, steckte er fest

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

Versuche dies

Shengshan Zhang
quelle
0

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

  1. Unter Einstellung -> SBT -> Unter der Zeile im Textfeld VM-Parameter einfügen:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005

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

    sbt -jvm-debug 5005

    Hinweis: Diese Zeile sollte im Terminal angezeigt werden: "Abhören des Transports dt_socket unter der Adresse: 5005"

  3. Konfigurationen bearbeiten -> Klicken Sie auf + -> Wählen Sie 'Remote'

    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 im Edit ConfigurationsListenfeld DebugMyModule aus und klicken Sie auf Debug .

    Hinweis: Die Debug-Ansicht sollte geöffnet sein und in der Debug-Konsole sollte "Verbunden mit der Ziel-VM, Adresse : '127.0.0.1:5005', Transport: 'Socket'" angezeigt werden.

  5. Fügen Sie in Ihrer Testklasse in einigen Testfällen Haltepunkte ein.

  6. Kommen Sie zum Terminal, wo Sie " sbt -jvm-debug 5005" laufen und wie unten laufen

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

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

  7. Sie können sehen, dass das Debuggen in Ihrem Testfall-Haltepunkt gestartet wurde.

Sonne
quelle
Funktioniert nicht mit Ubuntu 16.04 und IntelliJ 2017.3, der Debugger wird angehängt, aber Haltepunkte werden ignoriert.
Jonathan Neufeld
testSuite kann nicht am Haltepunkt anhalten. Wenn sich der Haltepunkt jedoch in einer Hauptmethode befindet, kann dies der Fall sein.
Shengshan Zhang
0

Das AttachMe IntelliJ-Plugin ist möglicherweise schneller, wenn Sie den Debugger anhängen, ohne mit den Portnummern herumspielen zu müssen:

AttachMe hängt den IntelliJ-Debugger automatisch an, selbst wenn Sie Ihre App vom Terminal aus starten (oder auf andere Weise). Sie müssen die Attach to processAktion nicht manuell auslösen .

Blogpost und Readme haben Setup-Anweisungen, aber ich musste sie ein wenig ändern, damit es auf meinem Computer funktioniert

  1. installer.shSkript vom offiziellen Repo herunterladen

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Geben Sie ihm ausführbare Berechtigungen chmod u+x installer.sh
  3. Führen Sie es mit ./installer.sh
  4. Dies sollte den Agenten unter installieren /.config/attachme/agent.jarund eine ~/.attachmeDatei erstellen
  5. Ändern, um ~/.attachmezu enthalten

    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. Installieren Sie das entsprechende Attachme-Plugin und starten Sie es neu: IntelliJ | Preferences | Plugins

  7. Laufkonfiguration erstellen Attachme:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Nach diesen einmaligen Spielereien können wir automatisch einen Debugger anhängen

  1. Starten Sie die AttachmeAusführungskonfiguration
  2. source ~/.attachme
  3. Starten Sie die Anwendung möglicherweise vom Terminal aus. sbt "runMain example.Hello"
  4. Der Debugger sollte automatisch an jedem Haltepunkt anhängen und anhalten
Mario Galic
quelle
-1

Gemäß der obigen Antwort von Roberto Tyley, aber unter Windows müssen wir nach der Installation von sbt auch die folgenden Umgebungsvariablen festlegen:

SBT_HOME
C: \ Programme (x86) \ sbt \
[oder wo immer sbt installiert ist]

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

[gemäß dem IntelliJ-Beispiel von RT]

Zum Pfad hinzufügen:% SBT_HOME% \ bin;% SBT_OPTS%

Führen Sie dann in der Befehlszeile im Projektordner "sbt run -jvm -debug 5005" Folgendes aus.

Wenn dies ordnungsgemäß funktioniert, gibt die Befehlszeile zunächst eine Zeile zu "Abhören des Transports dt_socket unter der Adresse: 5005" aus.

Haltepunkt in IntelliJ setzen.

Öffnen Sie die Website im Browser, um den Debugger-Haltepunkt auszulösen, z. B. " http: // localhost: 9000 / ".

decdev2012
quelle