Debugowanie kodu Scala za pomocą prostego narzędzia do kompilacji (SBT) i IntelliJ

120

Jaki jest najłatwiejszy sposób debugowania kodu Scala zarządzanego przez sbt przy użyciu wbudowanego debuggera IntelliJ? Dokumentacja z „RunningSbt” ze strony Google Code firmy sbt zawiera listę poleceń do uruchamiania głównej klasy projektu lub testów, ale wydaje się, że nie ma poleceń do debugowania.

Pytanie uzupełniające: jaki jest najłatwiejszy sposób dołączenia debugera IntelliJ do Jetty przy użyciu polecenia jetty-run sbt?

Mateusz
źródło
6
Proszę nie mieszać pytań w przyszłości
hennr

Odpowiedzi:

47

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

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

-Xdebug -Xrunjdwp: transport = dt_socket, serwer = y, suspend = n, adres = 5005

Uruchom sbt z tymi argumentami, a następnie wykonaj jetty-run. Na koniec uruchom konfigurację zdalnego debugowania w IntelliJ. Ten wątek może być przydatny.

Aaron Novstrup
źródło
1
dla mnie Zwykle nie działa dobrze: stackoverflow.com/questions/16337745/…
ses
Gdzie to wpisujesz? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622
@ Jwan622 Uruchom sbt z tymi argumentami (np. Z wiersza poleceń, podając je jako argumenty wiersza poleceń). Następnie wykonaj jetty-runpolecenie w wierszu polecenia sbt.
Aaron Novstrup
więc po prostu biegnij sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622
3
Dla większości użytkowników to powinno działać, ale zależy to od konfiguracji sbt w systemie. Jak wspomniano w drugiej odpowiedzi, możesz po prostu biegać sbt -jvm-debug 5005.
Aaron Novstrup
189

W -jvm-debugoficjalnych pakietach SBT dla komputerów Mac, Linux i Windows znajduje się bardzo wygodna flaga . Możesz użyć flagi, aby określić port debugowania:

sbt -jvm-debug 5005

Pod okładkami uruchamia to JVM dla SBT z typową inkantacją dotyczącą pełnego debugowania:

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

Możesz teraz uruchomić swój kod normalnie, na przykład za pomocą runpolecenia sbt .

Konfigurowanie IntelliJ do łączenia się z uruchomionym kodem ...

Teraz podłącz IntelliJ do uruchomionego procesu przy użyciu konfiguracji zdalnego debugowania . Należy zauważyć, że górne 3 pola w tej formie, a przerażające, to tylko, aby skopiować tekst z od, raczej niż do (oni dając gadatliwy debugowania inkantację określony powyżej, który -jvm-debugjuż zajmuje się dla ciebie) - jedyna konfiguracja możesz zmienić jest w Settingssekcji w połowie drogi:

Konfiguracja zdalnego debugowania w IntelliJ

Roberto Tyley
źródło
1
To nie działa na Windowsie - masz pomysł, jak zrobić coś podobnego na tej (kiepskiej) platformie?
javadba
To jest skrypt uruchamiający, który moim zdaniem jest używany w systemie Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Zachęcam Cię do zastanowienia się, jak zmodyfikować skrypt, aby zaakceptował -jvm-debugparametr i przesłać to jako żądanie ściągnięcia - masz duże szanse na skorzystanie z korzyści dla wszystkich, którzy znajdują się na tej samej platformie.
Roberto Tyley
Zajrzałem do tego. Skrypt uruchamiania systemu Windows jest WAY prymitywny w porównaniu z linuxem. Nie mogę tego teraz zrobić.
javadba
1
Żądanie ściągnięcia połączone ... patrz poniżej
Darren Bishop
3
Dobrze by było wiedzieć, gdzie wstawić „sbt -jvm 5005” w IntelliJ
eddy147
39

Ja też miałem z tym problem, więc ryzykując nadmierną szczegółowością, oto co zrobiłem:

USTAWIAĆ

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

    • Przejdź do Uruchom> Edytuj konfiguracje
    • Kliknij ikonę [+] i wybierz Scala Compilation Server
    • Wpisz dowolną nazwę, kliknij pole wyboru „Uruchom akcję SBT” i wybierz z [...]
  2. Utwórz konfigurację debugowania do zdalnego debugowania

    • Przejdź do Uruchom> Edytuj konfiguracje
    • Kliknij ikonę [+] i wybierz opcję Remote
    • Wprowadź dowolną nazwę i skopiuj linię -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(pamiętaj, aby kliknąć OK, aby faktycznie utworzyć konfigurację)
  3. Skonfiguruj wtyczkę SBT, aby uruchomić powyższe opcje maszyny wirtualnej

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

DEBUGOWANIE

  1. Ustaw punkty przerwania według potrzeb
  2. Uruchom serwer WWW pomostu, wybierając utworzoną powyżej konfigurację sbt jetty-run i wybierając opcję Uruchom> Uruchom 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
Jamie Forrest
źródło
16
w menu Konfiguracje nie ma serwera kompilacji Scala. Więc potrzebuję czegoś specjalnego?
Arne
Wygląda na to, że krok 1 nie jest wymagany, wykonuję polecenie sbt sbt -jvm-debug 5005 console, a następnie ustawiam punkt przerwania w intelllJ Idea, uruchamiam debug.
Pengfei.X
@ Pengfei.X, sbt -jvm-debug 5005 consolenie działa dla mnie, ale sbt -jvm-debug 5005tak.
Łukasz Czerwiński
8

Ten działa dla mnie za każdym razem i jedyną rzeczą, którą musisz skonfigurować, jest 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

Następnie mogę rozpocząć zdalne debugowanie na localhost: 5005

Erik Madsen
źródło
7

Dodaję tutaj inną odpowiedź, ponieważ znalazłem to pytanie podczas wyszukiwania powiązanego problemu: Debugowanie klas testowych za pomocą punktów przerwania.

Używam ScalaTest i zwykle uruchamiam pakiet za pomocą polecenia „tylko test” sbt. Teraz, gdy chcę skorzystać z interaktywnego debuggera, mogę wykonać następujące czynności:

Utwórz nową konfigurację uruchamiania / debugowania typu „ScalaTest”, wpisz główną nazwę „Test Class:” i wybierz opcję „Before launch: Run SBT Action„ test-compile ””. To wszystko, możesz teraz umieścić punkty przerwania w źródłach testowych i uruchomić tę konfigurację.

0__
źródło
to samo, ale nie działa dobrze: stackoverflow.com/questions/16337745/…
ses
czy wiesz, jak mogę przeprowadzić tylko jeden test, jeśli klasa testowa obejmuje kilka testów? Czy mógłbyś spojrzeć na następujące pytanie stackoverflow.com/questions/54977741/…
Manu Chadha
7

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

w tym zrozumienie tła, którego nie miałem, kiedy zaczynałem ...

Jest to oparte głównie na instrukcjach tutaj z dodatkowym wyjaśnieniem, które przeprowadziło mnie przez to.

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

Tło:

  • Z jakiegoś powodu użycie SBT do kompilacji Scali w IntelliJ nie jest zintegrowane w taki sam sposób, jak projekty Maven (które pozwalają na bardzo łatwe debugowanie).
  • 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ć maszynę JVM lub aplikację, który umożliwia sterowanie przepływem wykonywania kodu.
  • Narzędzie debugowania, którego używasz, może następnie wydawać polecenia silnikowi debugowania, które mówi mu „wykonaj następny wiersz kodu, a następnie ponownie wstrzymaj”, „kontynuuj wykonywanie” lub „pobierz wartość zmiennej przechowywanej w pamięci”.

Co to jest zdalne debugowanie?

  • Zdalne debugowanie to debugowanie przez połączenie sieciowe (gniazdo).
  • To połączenie sieciowe umożliwia wydawanie poleceń mechanizmowi debugowania z komputera zdalnego.
  • Jest to przydatne, gdy chcesz debugować kod działający na serwerze zdalnym, ALE
  • Jest to również przydatne w sytuacjach, takich jak kod Scala działający w ramach SBT i uruchamiany za pośrednictwem serwera internetowego, takiego jak Jetty lub Tomcat, niezależnie od środowiska IntelliJ.

W odniesieniu do powyższego łącza przydatne są następujące wyjaśnienia / modyfikacje:

  1. Skonfiguruj IntelliJ, aby uruchomić SBT z ustawieniami maszyny 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 odpowiada ustawieniom maszyny JVM z kroku 1.
  3. Po uruchomieniu SBT musisz to zrobić za pomocą wtyczki SBT Console (którą skonfigurowałeś w kroku 1). Jeśli używasz SBT poza IntelliJ (w wierszu 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 jeszcze nie jest), a maszyna JVM jest skonfigurowana do zdalnego debugowania.
  4. Spowoduje to uruchomienie narzędzia IntelliJ Debugging Tool, które łączy się z maszyną JVM uruchomioną w kroku 3.
  5. Na koniec zaczynasz kompilację w konsoli SBT. Możesz to zrobić za pomocą dowolnego polecenia kompilacji, w tym polecenia kompilacji ciągłej. W przypadku ciągłej ponownej kompilacji nastąpi ponowna kompilacja, ale nie w przypadku wstrzymania wykonywania kodu przez debuger.
Mikrofon
źródło
4
link jest uszkodzony.
Andrew Bucknell
4

Miałem problemy z debugowaniem również w systemie Windows z aplikacją Spray-can / Akka / Scala zbudowaną za pośrednictwem SBT przy użyciu Intellij. Łącząc różne sugestie, najprostszym podejściem było dla mnie:

  1. Upewnij się, że masz sbt.Revolver w swoim pliku projektu / plugsin.sbt np

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

  2. Ustaw opcje java w pliku build.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 wstrzymanie aplikacji do momentu podłączenia zdalnego debugera z Intellij

  1. Skonfiguruj konfigurację debugera w Intellij za pomocą menu Uruchom / Edytuj konfiguracje. Naciśnij przycisk +, wybierz opcję „Remote”. Upewnij się, że wpisy są zgodne z powyższymi opcjami java, w szczególności z adresem portu 5005. Nadaj konfiguracji nazwę taką jak „Spray”.

  2. Z konsoli SBT użyj polecenia ponownego uruchomienia. Na wyjściu sprzężenia zwrotnego powinien być widoczny adres portu 5005.

  3. W Intellij ustaw swoje punkty przerwania.

  4. W Intellij wybierz 'Spray' Run \ Debug. Powinno to połączyć się z serwerem internetowym puszki sprayu. Powinieneś być w stanie zobaczyć wiele wątków w oknie debugowania.

  5. Uważaj, niektóre z dyrektyw Get w Spray wydają się być wykonywane przy uruchomieniu, ale nie podczas wywoływania witryny wielokrotnie.

Herc
źródło
błogosławię cię za tę odpowiedź! działał jak urok.
user2770362
3

Co jest warte, Windows folk, edytuj %SBT_HOME%\bin\sbt.bati znajdź następujące wiersze 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 zamień je na ten kod:

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, -jvm-debuggdy widzę je w programie uruchamiającym skrypt Bash

NB. Nie sądzę, aby %SBT_HOME%faktycznie istniał poza tym skryptem, chyba że stworzyłeś je bezpośrednio w swoim środowisku, ale i tak rozumiesz: D

Darren Bishop
źródło
1
Żądanie pull połączone
Darren Bishop
3

Plik-> Ustawienia-> Inne ustawienia-> Parametry maszyny wirtualnej SBT -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005

Uruchom-> Edytuj konfiguracje Naciśnij +, a następnie wybierz zdalne Naciśnij Zastosuj

Teraz w konsoli SBT (uruchomionej w środku przez intelliJ) po wykonaniu polecenia 'run' zobaczysz "Nasłuchiwanie transportu dt_socket pod adresem: 5005"

Teraz naciśnij Run-> Debug. Zobaczysz aktywne menu debugowania poniżej. Posiada dwie zakładki Debugger i Console.

Użyj F7, aby przejść od następnej linii do następnej

Wybrałem zawieszenie, aby być n. Ponieważ było y, kiedy uruchomiłem polecenie uruchomienia, utknęło

płaszczka
źródło
1
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

Spróbuj tego

shengshan zhang
źródło
0

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

  1. W Ustawienia -> SBT -> Wklejono poniższy wiersz w polu tekstowym Parametry maszyny wirtualnej:

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

  2. Otworzyłem Termilal w IntelliJ i uruchom:

    sbt -jvm-debug 5005

    Uwaga: w terminalu powinna pojawić się ta linia: „Nasłuchiwanie transportu dt_socket pod adresem: 5005”

  3. Edytuj konfiguracje -> Kliknij + -> Wybierz „Zdalne”

    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 Edit Configurationspolu listy i kliknij Debuguj .

    Uwaga: powinien być otwarty widok debugowania, aw konsoli debugowania powinien być widoczny komunikat „Połączono z docelową maszyną wirtualną, adres:, '127.0.0.1:5005'transport: 'gniazdo'”

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

  6. Przyjdź do terminala, gdzie uruchamiasz „ sbt -jvm-debug 5005” i biegniesz jak poniżej

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

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

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

Słońce
źródło
Nie działa z Ubuntu 16.04 i IntelliJ 2017.3, debugger dołącza, ale punkty przerwania są ignorowane.
Jonathan Neufeld
testSuite nie może zatrzymać się w punkcie przerwania, jednak jeśli punkt przerwania znajduje się w metodzie głównej, może.
shengshan zhang
0

Wtyczka AttachMe IntelliJ jest potencjalnie szybsza w podłączaniu debugera bez konieczności manipulowania numerami portów:

AttachMe będzie dołączyć debugera IntelliJ automatycznie , nawet jeśli zaczynają swoją aplikację z terminala (lub w inny sposób). Nie musisz uruchamiać Attach to processakcji ręcznie.

Post na blogu i plik Readme zawierają instrukcje konfiguracji, jednak musiałem je nieco zmienić, aby działały na moim komputerze

  1. Pobierz installer.shskrypt z oficjalnego repozytorium

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Nadaj mu uprawnienia do wykonywania chmod u+x installer.sh
  3. Uruchom to z ./installer.sh
  4. Powinno to zainstalować agenta /.config/attachme/agent.jari utworzyć ~/.attachmeplik
  5. Zmień, ~/.attachmeaby zawierać

    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. Zainstaluj odpowiednią wtyczkę Attachme i uruchom ponownie: IntelliJ | Preferences | Plugins

  7. Utwórz Attachmekonfigurację uruchomienia:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Po tych jednorazowych oszustwach możemy automatycznie dołączyć debugger przez

  1. Rozpocznij Attachmekonfigurację uruchamiania
  2. source ~/.attachme
  3. Być może uruchom aplikację z terminala, sbt "runMain example.Hello"
  4. Debuger powinien automatycznie dołączyć i zatrzymać się w dowolnym punkcie przerwania
Mario Galic
źródło
-1

Zgodnie z powyższą odpowiedzią Roberto Tyleya, ale w systemie Windows po zainstalowaniu sbt musimy również ustawić następujące zmienne środowiskowe:

SBT_HOME
C: \ Program Files (x86) \ sbt \
[lub gdziekolwiek sbt jest zainstalowany]

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

[za przykład IntelliJ RT]

Dodaj do ścieżki:% SBT_HOME% \ bin;% SBT_OPTS%

Następnie uruchom następujące polecenie w wierszu poleceń w folderze projektu „sbt run -jvm -debug 5005”.

Jeśli to działa poprawnie, wiersz poleceń początkowo wyświetli wiersz „Nasłuchiwanie transportu dt_socket pod adresem: 5005”.

Ustaw punkt przerwania w IntelliJ.

Otwórz witrynę w przeglądarce, aby wywołać punkt przerwania debugera, np. „ Http: // localhost: 9000 / ”.

decdev2012
źródło