Debugowanie kodu Scali za pomocą simple-build-tool (SBT) i IntelliJ

Jaki jest najprostszy sposób na debugowanie kodu Scali zarządzanego przez SBT przy użyciu wbudowanego debugera IntelliJ? Dokumentacja z "RunningSbt" ze strony Google code SBT zawiera listę poleceń do uruchomienia głównej klasy dla projektu lub testów, ale wydaje się, że nie ma poleceń do debugowania.

Kolejne pytanie: jaki jest najprostszy sposób podłączenia debuggera IntelliJ do Jetty podczas używania polecenia jetty-run SBT?

Author: stites, 2010-11-11

12 answers

Do zwykłego debugowania w IntelliJ, możesz użyć konfiguracji run/debug aplikacji w zwykły sposób, niezależnie od tego, czy używasz sbt do kompilacji kodu.

Aby połączyć się z aplikacją działającą w Jetty, musisz utworzyć zdalną konfigurację debugowania. Kiedy to zrobisz, IntelliJ poda ci zestaw argumentów wiersza poleceń do uruchomienia zdalnego JVM -- coś w stylu

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

Uruchom sbt z tymi argumentami, a następnie wykonaj jetty-run. Na koniec uruchom zdalną konfigurację debugowania w IntelliJ. ten wątek może się przydać.

 41
Author: Aaron Novstrup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-11 02:35:28

Jest bardzo wygodny -jvm-debug flaga w oficjalnych pakietach SBT dla Mac, Linux & Windows. Można użyć flagi, aby określić Port Debugowania:

sbt -jvm-debug 5005

Pod pokrywami rozpoczyna się JVM dla SBT z typową słowną inkantacją debugowania:

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

Możesz teraz uruchamiać swój kod normalnie, na przykład za pomocą polecenia SBT run.

Konfigurowanie IntelliJ tak, aby łączył się z uruchomionym kodem...

Now you connect IntelliJ do twojego procesu biegania za pomocą Zdalna konfiguracja debugowania. Zauważ, że górne 3 pola w tym formularzu, choć przerażające, są tylko dla ciebie, aby skopiować tekst Z of, a nie do (dają szczegółowe zaklęcie debugowania określone powyżej, które -jvm-debug już za Ciebie odpowiada) - jedyną konfiguracją, którą możesz zmienić, jest sekcjaSettings W połowie drogi w dół:

Zdalna konfiguracja debugowania w IntelliJ

 155
Author: Roberto Tyley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 15:54:57

Ja też miałem z tym problemy, więc ryzykując zbyt dużą szczegółowość, oto co zrobiłem:

SETUP

  1. Utwórz konfigurację uruchamiania dla sbt jetty-run

    • przejdź do Run > Edytuj konfiguracje
    • Kliknij ikonę [ + ] i wybierz Scala Compilation Server
    • wprowadź dowolną nazwę, a następnie kliknij pole wyboru "Uruchom akcję SBT"i wybierz akcję SBT-Uruchom z [...]
  2. Utwórz debugowanie konfiguracja zdalnego debugowania

    • przejdź do Run > Edytuj konfiguracje
    • Kliknij ikonę [ + ] i wybierz zdalny
    • wprowadź dowolną nazwę i skopiuj linię -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 (upewnij się, że klikniesz OK, aby utworzyć konfigurację)
  3. Konfiguracja wtyczki SBT do uruchamiania opcji vm powyżej

    • przejdź do File > Settings > SBT
    • Wklej wiersz -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 w polu Parametry maszyny wirtualnej, po tych, które są już tam

Debugowanie

  1. Ustaw punkty przerwania zgodnie z życzeniem
  2. Uruchom jetty web server wybierając konfigurację SBT jetty-run utworzoną powyżej i wybierając Run > Run lub klikając zieloną strzałkę
  3. Uruchom zdalny debuger, wybierając konfigurację zdalnego debugowania utworzoną powyżej i wybierając Uruchom > Debuguj lub klikając ikonę błędu
 39
Author: Jamie Forrest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 22:31:07

Dodaję tu kolejną odpowiedź, ponieważ znalazłem to pytanie, szukając pokrewnego problemu: debugowanie klas testowych za pomocą punktów przerwania.

Używam ScalaTest i zazwyczaj uruchamiam pakiet używając polecenia "tylko test" sbt. Teraz, gdy chcę użyć interaktywnego debuggera, mogę wykonać następujące czynności:

Utwórz nową konfigurację Run/Debug typu 'ScalaTest', wpisz główną nazwę "Test Class:" i wybierz "Before launch: Run SBT Action 'test-compile'". To jest to, możesz umieść punkty przerwania teraz w źródłach testowych i uruchom tę konfigurację.

 7
Author: 0__,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 12:40:24

Ten działa u mnie za każdym razem i jedyne co musisz skonfigurować to zdalne debugowanie w IntelliJ; uruchamiam SBT z parametrami JVM z terminala w IntelliJ:

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

Po tym mogę rozpocząć zdalne debugowanie na localhost:5005

 6
Author: Erik Madsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 14:46:56

Żadna z tych odpowiedzi lub podanych linków nie zadziałała dla mnie, więc kiedy już to rozgryzłem, pomyślałem, że się podzielę...

Łącznie ze zrozumieniem tła, którego nie miałem, gdy zaczynałem...

Opiera się to głównie na instrukcjach tutaj tylko z dodatkowym wyjaśnieniem, które mnie przez to przeprowadziło.

Moje Środowisko: Scala 2.10.2, SBT 0.13 i IntelliJ 13.1

Background:

  • z jakiegokolwiek powodu, używając SBT do kompilacji Scali w IntelliJ nie jest zintegrowany tak, jak projekty Mavena (które umożliwiają debugowanie naprawdę łatwo).
  • z mojego zrozumienia wynika, że kompilując z SBT, kompilujesz w osobnym procesie, dlatego musisz zdalnie debugować.

Co to jest debugowanie?

  • debugowanie to tryb, w którym można uruchomić JVM lub aplikację, który pozwala kontrolować przepływ wykonywania kodu.
  • Narzędzie do debugowania, którego używasz, może następnie wydać polecenia do silnika debugowania, który mówi mu "wykonaj następny wiersz kodu, a następnie wstrzymaj ponownie" lub "kontynuuj wykonywanie" lub "Pobierz wartość zmiennej zapisanej tutaj w pamięci".

Czym jest zdalne debugowanie?

  • debugowanie Zdalne to debugowanie przez połączenie sieciowe (Gniazdo).
  • to połączenie sieciowe pozwala na wydanie poleceń do silnika debugowania ze zdalnego komputera.
  • jest to przydatne, gdy chcesz debugować kod, który działa na zdalnym serwerze, ale
  • jest również przydatny w sytuacjach, takich jak kod Scali uruchamiany pod SBT i uruchamiany przez serwer WWW, taki jak Jetty lub Tomcat, oddzielony od środowiska IntelliJ.

Odwołując się do powyższego linku, przydatne są następujące wyjaśnienia/modyfikacje:

  1. Ustaw IntelliJ, aby uruchomić SBT z ustawieniami JVM" Włącz debugowanie", w tym portem używanym podczas konfigurowania gniazda sieciowego. (bez zmian) dodaj nazwane parametry maszyny Wirtualnej do ustawień IntelliJ.
  2. upewnij się, że numer portu pasuje do ustawień JVM z kroku 1.
  3. Po uruchomieniu SBT musisz to zrobić z wtyczki konsoli SBT (którą skonfigurowałeś w Kroku 1). Jeśli używasz SBT poza IntelliJ( w linii poleceń), musisz uruchomić SBT z tymi samymi parametrami maszyny Wirtualnej z kroku 1 (nie zrobiłem tego, więc nie ma instrukcji). Po tym kroku SBT jest teraz uruchomiony (ale twój kod jest jeszcze nie) i JVM jest skonfigurowany do zdalnego debugowania.
  4. uruchamia narzędzie debugowania IntelliJ, które łączy się z JVM, które uruchomiłeś w Kroku 3.
  5. na koniec uruchamiasz kompilację w konsoli SBT. Można to zrobić za pomocą dowolnego polecenia kompilacji, w tym ciągłego polecenia kompilacji. W przypadku ciągłej ponownej kompilacji, rekompilacja nastąpi, ale nie podczas gdy wykonywanie kodu Jest wstrzymywane przez debugger.
 5
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 02:32:13
 3
Author: Tulio Domingos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 08:43:56

Borykam się też z debugowaniem na Windows z aplikacją Spray-can / Akka / Scala zbudowaną przez SBT, przy użyciu Intellij. Składając różne sugestie, najprostsze podejście dla mnie było:

  1. Upewnij się, że masz sbt.Rewolwer w Twoim projekcie / wtyczkach.plik sbt np.

    AddSbtPlugin ("io.spray " % "SBT-revolver" % "0.7.1")

  2. Ustaw javaoptions w swoim build.plik sbt:

    JavaOptions: = Seq ("- Xdebug", "- Xrunjdwp: transport=dt_socket,server=y,suspend=y,address=5005")

W szczególności użyj opcji suspend = y. Spowoduje to przytrzymanie aplikacji, dopóki nie podłączysz zdalnego debuggera z Intellij

  1. Skonfiguruj konfigurację debuggera w Intellij za pomocą menu Uruchom / Edytuj konfiguracje. Naciśnij przycisk+, Wybierz opcję "zdalne". Upewnij się, że wpisy pasują do javaoptions powyżej, w szczególności do adresu portu 5005. Nadaj configowi nazwę taką jak "Spray".

  2. Z konsoli SBT użyj polecenia re-start. Powinieneś zobaczyć adres portu 5005 na wyjściu sprzężenia zwrotnego.

  3. W Intellij Ustaw swoje punkty przerwania.

  4. Z Intellij, wybierz Run \ Debug 'Spray'. To powinno połączyć się z serwerem WWW spray-can. Powinieneś być w stanie zobaczyć wiele wątków w oknie debugowania.

  5. Uważaj, że niektóre dyrektywy Get W Sprayu wydają się być wykonywane po uruchomieniu, ale nie wielokrotnie na wywołanie strony internetowej.

 3
Author: Herc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 12:08:45

File->Settings - > Other Settings- > SBT Parametry maszyny wirtualnej -Xmx512M-XX: MaxPermSize=256m-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

Run - > Edytuj Konfiguracje Naciśnij + , a następnie wybierz zdalny Naciśnij Zastosuj

Teraz w konsoli SBT (uruchomionej wewnątrz przez intelliJ) po wykonaniu polecenia ' run 'zobaczysz" nasłuchiwanie transportu dt_socket pod adresem: 5005 "

Teraz naciśnij Run - >Debug. Zobaczysz menu debugowania poniżej aktywowane. Posiada dwie karty Debugger i konsoli.

Użyj F7 do od następnego wiersza do następnego

Wybrałem suspend jako N. z tym, że jest y kiedy uruchomiłem komendę run to zostało zablokowane

 3
Author: rayfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 12:36:30

Jeśli warto, edytuj %SBT_HOME%\bin\sbt.bat i zlokalizuj następujące linie kodu:

:run

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

Następnie zastąp je tym kodem:

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

Najlepsze, co mogę zrobić, aby uzyskać takie samo zachowanie dla -jvm-debug, gdy widoczne w launcherze skryptów Bash

NB. Nie wydaje mi się, żeby %SBT_HOME% faktycznie istniał poza tym skryptem, chyba że stworzyłeś go wprost w swoim środowisku, ale w każdym razie rozumiesz o co chodzi: D

 2
Author: Darren Bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 21:35:00

Ja też mam ten sam problem, lubię dzielić się tym, jak go rozwiązałem. Przy okazji używam Ubuntu 14.04 i IntelliJ 15.

  1. W ustawieniu - > SBT -> Wklejony poniżej wiersz w polu tekstowym parametrów maszyny wirtualnej:

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

  2. Otwarty Termilal w IntelliJ i uruchom:

    Sbt-jvm-debug 5005

    Uwaga: powinieneś zobaczyć ten wiersz w terminalu: "Listening for transport dt_socket at address: 5005 "

  3. Edytuj Konfiguracje -> Kliknij + - > Wybierz '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. Wybierz DebugMyModule w polu listy Edit Configurations i kliknij Debug.

    Uwaga: powinien być otwarty widok debugowania, a w konsoli debugowania powinien być widoczny "podłączony do docelowej maszyny wirtualnej, adres: '127.0.0.1:5005', transport: 'gniazdo '"

  5. Umieść punkty przerwania w kilku przypadkach testowych w swojej klasie testowej.

  6. Come to Terminal gdzie biegniesz " sbt -jvm-debug 5005" i biegniesz jak poniżej

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

    Na przykład: com.myproject.moduł.AddServiceTest [Spec]

  7. Możesz zobaczyć rozpoczęcie debugowania w punkcie przerwania przypadku testowego.

 0
Author: Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-18 17:52:47
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

Spróbuj tego

 0
Author: shengshan zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 13:47:04