Налагодження коду Scala за допомогою інструмента простого збирання (sbt) та IntelliJ


120

Який найпростіший спосіб налагодити код Scala, керований sbt, використовуючи вбудований налагоджувач IntelliJ? Документація від "RunningSbt" з кодового сайту google sbt перелічує команди для запуску основного класу для проекту чи тестів, але, здається, немає команд для налагодження.

Наступне запитання: який найпростіший спосіб приєднати налагоджувач IntelliJ до Jetty, коли використовується команда sbt's run-jet?


6
Будь ласка, не змішуйте питань у майбутньому
hennr

Відповіді:


47

Для звичайної налагодження в IntelliJ, ви можете використовувати конфігурацію запуску / налагодження програми звичайним способом, незалежно від того, використовуєте ви sbt для складання коду.

Для підключення до програми, що працює в Jetty, вам потрібно буде створити конфігурацію віддаленої налагодження. Коли ви це зробите, IntelliJ надасть вам набір аргументів командного рядка для запуску віддаленого JVM - щось подібне

-Xdebug -Xrunjdwp: транспорт = dt_socket, сервер = y, призупинення = n, адреса = 5005

Запустіть sbt за допомогою цих аргументів, а потім виконайте jetty-run. Нарешті, запустіть конфігурацію віддаленої налагодження в IntelliJ. Ця нитка може бути корисною.


1
Для мене звичайним чином це не працює добре: stackoverflow.com/questions/16337745/…
ses

Де ти це вводиш? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622

@ Jwan622 Запустіть sbt з цими аргументами (наприклад, з командного рядка, подаючи їх як аргументи командного рядка). Потім виконайте jetty-runу запиті sbt.
Аарон Новструп

так просто бігати sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622

3
Для більшості користувачів це повинно працювати, але це залежить від налаштування sbt у вашій системі. Як зазначено в іншій відповіді, ви можете просто запуститись sbt -jvm-debug 5005.
Аарон Новструп

189

В -jvm-debugофіційних пакетах SBT для Mac, Linux та Windows є дуже зручний прапор . Ви можете використовувати прапор, щоб вказати порт налагодження:

sbt -jvm-debug 5005

Під обкладинками це запускає JVM для SBT з типовим багатослівним налагодженням налагодження:

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

Тепер ви можете запустити свій код як звичайний, наприклад, за допомогою runкоманди sbt .

Налаштування IntelliJ для підключення до запущеного коду ...

Тепер ви підключаєте IntelliJ до запущеного процесу за допомогою конфігурації віддаленої налагодження . Зверніть увагу , що верхні 3 поля в цій формі, в той час як страшно, просто для вас , щоб скопіювати текст з з, а не в (вони даючи детальну отладочную чаклунство зазначено вище, яка -jvm-debugвже піклується про вас) - єдина конфігурація ви можете змінити його в Settingsрозділі на півдорозі:

Конфігурація віддаленої налагодження в IntelliJ


1
Це не працює в Windows - будь-яка ідея, як зробити подібне на цій (паршивій) платформі?
javadba

Цей сценарій запуску, я вважаю, використовується для Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Я б радив вам розібратися, як змінити скрипт, щоб прийняти -jvm-debugпараметр, і подати це як запит на витяг - ви маєте хороший шанс отримати користь усім, хто опиниться на одній платформі.
Роберто Тілей

Зазирнув у це. Сценарій запуску Windows - це WAY primitive vs Linux. Не можу зараз зробити.
javadba

1
Затягнутий запит об’єднано ... дивіться нижче
Даррен Єпископ

3
Було б корисно знати, куди потрібно вставити "sbt -jvm 5005" в IntelliJ
eddy147

39

У мене теж були проблеми з цим, тому, ризикуючи отримати надмірну деталізацію, ось що я зробив:

НАСТРОЙКА

  1. Створіть конфігурацію запуску для sbt jetty-run

    • Перейдіть до пункту Виконати> Редагувати конфігурації
    • Клацніть піктограму [+] та оберіть Scala Compilation Server
    • Введіть будь-яке ім'я та натисніть прапорець "Запустити SBT Action" та встановіть пункт "Запуск SBT Action" із пункту [...]
  2. Створіть конфігурацію налагодження для віддаленої налагодження

    • Перейдіть до пункту Виконати> Редагувати конфігурації
    • Клацніть піктограму [+] та виберіть Віддалений
    • Введіть потрібне ім’я та скопіюйте рядок -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(не забудьте натиснути ОК, щоб створити конфігурацію)
  3. Налаштуйте плагін sbt для запуску параметрів vm вище

    • Перейдіть у меню Файл> Налаштування> SBT
    • Вставте рядок -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005у поле параметрів VM після тих, які вже є

ВІДЗНАЧЕННЯ

  1. Встановіть точки перерви за бажанням
  2. Запустіть веб-сервер jetty, вибравши конфігурацію запуску sbt jetty, яку ви створили вище, та вибравши Виконати> Виконати або натиснувши зелену стрілку
  3. Запустіть віддалений налагоджувач, вибравши створену вище конфігурацію віддаленої налагодження та вибравши Запуск> Налагодження або натиснувши значок помилки

16
у меню конфігурацій немає сервера компіляції Scala. Тож мені потрібно щось особливе?
Арн

здається, що step1 не потрібен, що я роблю, це запустити команду sbt sbt -jvm-debug 5005 console, потім встановити точку розриву в intelllJ Idea, запустити налагодження.
Pengfei.X

@ Pengfei.X, sbt -jvm-debug 5005 consoleне працював для мене, але sbt -jvm-debug 5005зробив.
Лукаш Червінський

8

Це працює для мене кожен раз, і єдине, що вам потрібно налаштувати, - це віддалена налагодження в IntelliJ; Я запускаю SBT з параметрами JVM з терміналу в IntelliJ:

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

Після цього я можу почати віддалену налагодження на localhost: 5005


7

Тут я додаю ще одну відповідь, тому що я знайшов це питання, коли шукав пов’язану проблему: Налагодження тестових класів за допомогою точок прориву.

Я використовую ScalaTest, і я зазвичай запускаю набір, використовуючи команду sbt 'only-test'. Тепер, коли я хочу використовувати інтерактивний налагоджувач, я можу зробити наступне:

Створіть нову конфігурацію запуску / налагодження типу "ScalaTest", поставте головне ім'я "Тестовий клас:" та виберіть "Перед запуском: запустити тест-компіляцію SBT Action". Це все, ви можете розмістити точки прориву зараз у тестових джерелах та запустити цю конфігурацію.


те саме, але не працює добре: stackoverflow.com/questions/16337745/…
ses

чи знаєте ви, як я можу запустити лише один тест, якщо в тестовому класі є кілька тестів? Чи можете ви подивіться на таке запитання stackoverflow.com/questions/54977741/…
Ману Чадха

7

Жодна з цих відповідей чи наданих посилань не працювала для мене, тож коли я це зрозумів, я зрозумів, що поділюсь ...

включаючи передумови розуміння, яких у мене не було, коли я почав ...

Це ґрунтується, головним чином, на інструкціях тут лише з додатковими поясненнями, які мене перенесли через це.

Моє середовище: Scala 2.10.2, SBT 0.13 та IntelliJ 13.1

Фон:

  • З будь-якої причини використання SBT для компіляції Scala в IntelliJ не інтегровано таким чином, як проекти Maven (які дозволяють налагоджувати дійсно легко).
  • З мого розуміння випливає, що під час компіляції з SBT ви збираєтеся в окремий процес, отже, вам потрібно віддалено налагоджувати.

Що таке налагодження?

  • Налагодження - це режим, у якому можна запустити свій JVM або додаток, що дозволяє контролювати потік виконання коду.
  • За допомогою інструменту налагодження, який ви використовуєте, можна видавати команди на механізм налагодження, який повідомляє йому "виконати наступний рядок коду, потім зробити паузу ще раз" або "продовжити виконання" або "отримати значення змінної, збереженої тут у пам'яті".

Що таке віддалена налагодження?

  • Віддалена налагодження - це налагодження через мережеве з'єднання (сокет).
  • Це мережеве з'єднання дозволяє видавати команди на механізм налагодження з віддаленої машини.
  • Це корисно, коли ви хочете налагодити код, який працює на віддаленому сервері, АЛЕ
  • Він також корисний у таких ситуаціях, як код Scala, що працює під SBT та запускається через веб-сервер, наприклад Jetty або Tomcat, окремо від вашого IntelliJ.

Посилаючись на посилання вище, корисні такі пояснення / модифікації:

  1. Налаштуйте IntelliJ для запуску SBT з налаштуваннями JVM "увімкнути налагодження", включаючи порт, який слід використовувати під час налаштування мережевого сокета. (без змін) додайте названі параметри VM до налаштувань IntelliJ.
  2. Переконайтесь, що номер вашого порту тут відповідає вашим налаштуванням JVM з кроку 1.
  3. Коли ви запускаєте SBT, вам потрібно зробити це з плагіна консолі SBT (це те, що ви налаштували на кроці 1). Якщо ви використовуєте SBT поза IntelliJ (у командному рядку), вам потрібно буде запустити SBT з тими ж параметрами VM з кроку 1 (я цього не робив; тому ніяких інструкцій). Після цього кроку тепер запущено SBT (але ще не Ваш код), і JVM встановлюється для віддаленої налагодження.
  4. Це запускає інструмент налагодження IntelliJ, який підключається до JVM, який ви запустили на кроці 3.
  5. Нарешті, ви починаєте компіляцію в консолі SBT. Це можна зробити за допомогою будь-якої команди компіляції, включаючи команду безперервної компіляції. Якщо безперервна повторна компіляція відбудеться перекомпіляція, але не тоді, коли виконання коду буде призупинено налагоджувачем.

4
посилання розірвано.
Ендрю Бакнелл

4

Я боровся і з налагодженням в Windows за допомогою програми Spray-can / Akka / Scala, створеної за допомогою SBT, за допомогою Intellij. Збираючи разом різні пропозиції, для мене найпростішим підходом було:

  1. Переконайтеся, що у вашому проекті / plugsin.sbt-файлі є sbt.Revolver, наприклад

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

  2. Встановіть javaoptions у вашому файлі build.sbt:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp: transport = dt_socket, сервер = y, призупинити = y, адреса = 5005")

Зокрема, використовуйте опцію suspend = y. Ця програма буде тримати, поки ви не підключите віддалений налагоджувач від Intellij

  1. Налаштуйте конфігурацію налагодження в Intellij через меню Run / Edit Configuration. Натисніть кнопку +, виберіть варіант "Віддалений". Переконайтеся, що записи відповідають вказаним вище варіантам, зокрема адреса порту 5005. Надайте назву конфігурації типу "Spray".

  2. На консолі SBT використовуйте команду перезавантаження. Ви повинні побачити адресу порту 5005 у висновку зворотного зв'язку.

  3. В Intellij встановіть свої точки пробою.

  4. У Intellij виберіть команду Run \ Debug 'Spray'. Це має підключитися до веб-сервера розпилювача. Ви повинні мати можливість бачити безліч потоків у вікні налагодження.

  5. Будьте уважні, що деякі директиви Get у Spray, здається, виконуються під час запуску, але не раз під час виклику веб-сайту.


благослови на цю відповідь! працював як шарм.
користувач2770362


3

Для чого варто Windows Folk, відредагуйте %SBT_HOME%\bin\sbt.batта знайдіть наступні рядки коду:

:run

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

потім замініть їх цим кодом:

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

Найкраще, що я можу зробити, щоб отримати таку саму поведінку -jvm-debug коли її бачать у запуску скриптів Bash

NB. Я не думаю, що %SBT_HOME%насправді існує поза цим сценарієм, якщо ви явно не створили у вашому оточенні, але все одно ви зрозумієте: D


1
Затягнутий запит об’єднався
Даррен Єпископ

3

Файл-> Налаштування-> Інші параметри-> Параметри VM SBT -Xmx512M -XX: MaxPermSize = 256 М -Xdebug -Xrunjdwp: транспорт = dt_socket, сервер = у, призупинення = n, адреса = 5005

Виконати-> Редагувати конфігурації Натисніть +, а потім виберіть віддалений. Натисніть Застосувати

Тепер у консолі SBT (розпочатої всередині IntelliJ), коли ви виконайте команду 'запустити', ви побачите «Прослуховування транспорту dt_socket за адресою: 5005»

Тепер натисніть Виконати-> Налагодження. Ви побачите меню налагодження нижче активованим. Він має дві вкладки Налагоджувач і Консоль.

Використовуйте F7 з наступного рядка до наступного

Я вибрав призупинити, щоб бути n. Оскільки це було y, коли я запустив команду run, вона застрягла



0

У мене теж була така ж проблема, мені подобається поділитися тим, як я вирішив. До речі, я використовую Ubuntu 14.04 та IntelliJ 15.

  1. У Налаштуваннях -> SBT -> Вставлено під рядком у текстовому полі Параметри VM:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: транспорт = dt_socket, сервер = y, призупинення = n, адреса = 5005

  2. Відкрив Termilal в IntelliJ і запустив:

    sbt -jvm-debug 5005

    Примітка. Ви повинні побачити цей рядок у терміналі: "Прослуховування транспортного dt_socket за адресою: 5005"

  3. Редагування конфігурацій -> Клацніть + -> Виберіть "Віддалений"

    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. Виберіть DebugMyModule у Edit Configurationsвікні списку та натисніть кнопку Налагодити .

    Примітка. Ви побачите відкритий вигляд налагодження, і в консолі налагодження ви зможете побачити "Підключено до цільової VM, адреса:, '127.0.0.1:5005'транспорт:" socket ""

  5. Поставте точки проби в кількох тестових випадках у своєму тестовому класі.

  6. Приходьте до терміналу, де ви запускаєте " sbt -jvm-debug 5005" та біжите як нижче

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

    Наприклад: com.myproject.module.AddServiceTest [Spec]

  7. Ви можете побачити налагодження, розпочате у вашій точці розриву тестового випадку.


Не працює з Ubuntu 16.04 та IntelliJ 2017.3, налагоджувач додається, але точки пробою ігноруються.
Джонатан Нойфельд

testSuite не може зупинитися на точці розриву, однак якщо точка розриву є основним методом, вона могла б.
shengshan zhang

0

Плагін AttachMe IntelliJ - це потенційно швидший спосіб приєднати налагоджувач без необхідності поспілкуватися з номерами портів:

AttachMe приєднає відладчик IntelliJ автоматично , навіть якщо ви починаєте ваше додаток з терміналу (або будь-яким іншим способом). Не потрібно запускати Attach to processдії вручну.

Повідомлення в блозі та readme мають інструкції з налаштування, проте мені довелося трохи їх змінити, щоб він працював на моїй машині

  1. Завантажте installer.shсценарій з офіційного репо

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Надайте йому виконавчі дозволи chmod u+x installer.sh
  3. Запустіть його ./installer.sh
  4. Це повинно встановити агент під /.config/attachme/agent.jarі створити ~/.attachmeфайл
  5. Змініть, ~/.attachmeщоб містити

    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. Встановіть відповідний плагін Attachme та перезапустіть: IntelliJ | Preferences | Plugins

  7. Створіть Attachme конфігурацію запуску:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Після цих одноразових шенагіганів ми можемо приєднати налагоджувач автоматично

  1. Початок Attachme налаштування запуску
  2. source ~/.attachme
  3. Запустити програму з терміналу, можливо, sbt "runMain example.Hello"
  4. Відладчик повинен автоматично приєднуватися і зупинятися на будь-якій точці зламу

-1

Відповідно до відповіді Роберто Тілея вище, але в Windows нам також потрібно встановити наступні змінні середовища після встановлення sbt:

SBT_HOME
C: \ програмні файли (x86) \ sbt \
[або там, де встановлено sbt]

SBT_OPTS
-Xdebug -runjdwp: транспорт = dt_socket, сервер = y, призупинення = n, адреса = 5005

[на прикладі IntelliJ RT]

Додати до контуру:% SBT_HOME% \ bin;% SBT_OPTS%

Потім виконайте наступне в командному рядку в папці проекту "sbt run -jvm -debug 5005".

Якщо це працює належним чином, командний рядок спочатку виведе рядок повторно "Прослуховування транспортного dt_socket за адресою: 5005".

Встановіть точку розриву в IntelliJ.

Відкрийте веб-сайт у браузері, щоб запустити точку розриву налагодження, наприклад, " http: // localhost: 9000 / ".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.