Отладка кода Scala с помощью инструмента простой сборки (sbt) и IntelliJ

120

Какой самый простой способ отладить код Scala, управляемый sbt, с помощью встроенного отладчика IntelliJ? В документации от «RunningSbt» с сайта sbt google code перечислены команды для запуска основного класса проекта или тестов, но, похоже, нет команд для отладки.

Последующий вопрос: какой самый простой способ подключить отладчик IntelliJ к Jetty при использовании команды sbt jetty-run?

Мэтью
источник
6
Пожалуйста, не смешивайте вопросы в будущем
hennr

Ответы:

47

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

Чтобы подключиться к приложению, работающему в Jetty, вам необходимо создать конфигурацию удаленной отладки. Когда вы это сделаете, IntelliJ предоставит вам набор аргументов командной строки для запуска удаленной JVM - что-то вроде

-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 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.
Аарон Новструп 01
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 к вашему запущенному процессу, используя конфигурацию удаленной отладки . Обратите внимание, что три верхних поля в этой форме, хотя и пугающие, предназначены только для того, чтобы вы могли скопировать текст из , а не в (они дают подробное заклинание отладки, указанное выше, которое -jvm-debugуже позаботится о вас) - единственная конфигурация Вы можете изменить это в Settingsразделе на полпути вниз:

Конфигурация удаленной отладки в IntelliJ

Роберто Тайли
источник
1
Это не работает в Windows - есть идеи, как сделать подобное на этой (паршивой) платформе?
javadba
Это сценарий запуска, который, как мне кажется, используется для Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Я бы посоветовал вам выяснить, как изменить сценарий, чтобы принять -jvm-debugпараметр, и отправить его как запрос на перенос - у вас есть хорошие шансы принести пользу всем, кто находится на той же платформе.
Роберто Тайли
Заглянул в это. Скрипт запуска Windows ПУТЬ примитивен по сравнению с Linux. Не могу сделать сейчас.
javadba
1
Запрос на вытягивание объединен ... см. Ниже
Даррен Бишоп
3
Было бы полезно знать, где вставить «sbt -jvm 5005» в IntelliJ
eddy147
39

У меня тоже были проблемы с этим, поэтому, рискуя быть слишком подробным, вот что я сделал:

НАСТРОИТЬ

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

    • Перейдите в Run> Edit Configurations.
    • Щелкните значок [+] и выберите Сервер компиляции Scala.
    • Введите любое имя, которое хотите, и установите флажок «Запустить действие SBT» и выберите пробег причала действия SBT из [...]
  2. Создайте конфигурацию отладки для удаленной отладки

    • Перейдите в Run> Edit Configurations.
    • Щелкните значок [+] и выберите Remote
    • Введите любое имя, которое хотите, и скопируйте строку -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(не забудьте нажать OK, чтобы создать конфигурацию)
  3. Настройте плагин sbt для запуска указанных выше параметров vm

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

DEBUGGING

  1. Установите точки останова по желанию
  2. Запустите веб-сервер причала, выбрав созданную выше конфигурацию sbt jetty-run и выбрав «Выполнить»> «Выполнить» или щелкнув зеленую стрелку.
  3. Запустите удаленный отладчик, выбрав конфигурацию удаленной отладки, созданную вами выше, и выбрав «Выполнить»> «Отладка» или щелкнув значок ошибки.
Джейми Форрест
источник
16
в меню настроек нет сервера компиляции Scala. Так что мне нужно что-то особенное?
Arne
кажется, что шаг 1 не требуется, я запускаю команду sbt sbt -jvm-debug 5005 console, затем устанавливаю точку останова в intelllJ Idea, запускаю отладку.
Pengfei.X 01
@ 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 'test-only'. Теперь, когда я хочу использовать интерактивный отладчик, я могу сделать следующее:

Создайте новую конфигурацию запуска / отладки типа «ScalaTest», введите основное имя «Test Class:» и выберите «Перед запуском: выполнить действие SBT« test-compile »». Вот и все, теперь вы можете разместить точки останова в тестовых источниках и запустить эту конфигурацию.

0__
источник
то же самое, но не работает: 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 «включить отладку», включая порт, который будет использоваться при настройке сетевого сокета. (без изменений) добавьте указанные параметры виртуальной машины в настройки IntelliJ.
  2. Убедитесь, что ваш номер порта совпадает с настройками JVM из шага 1.
  3. Когда вы запускаете SBT, вам нужно сделать это из плагина SBT Console (который вы настроили на шаге 1). Если вы используете SBT вне IntelliJ (в командной строке), вам необходимо запустить SBT с теми же параметрами виртуальной машины, что и на шаге 1 (я этого не делал, поэтому никаких инструкций). После этого шага SBT теперь работает (но ваш код еще не запущен), а JVM настроена для удаленной отладки.
  4. Это запускает инструмент отладки IntelliJ, который подключается к JVM, которую вы запустили на шаге 3.
  5. Наконец, вы запускаете компиляцию в консоли SBT. Вы можете сделать это с помощью любой команды компиляции, включая команду непрерывной компиляции. При непрерывной повторной компиляции повторная компиляция произойдет, но не тогда, когда выполнение кода приостановлено отладчиком.
Майк
источник
4
ссылка не работает.
Эндрю Бакнелл
4

Я тоже боролся с отладкой в ​​Windows с помощью приложения Spray-can / Akka / Scala, созданного через SBT с использованием Intellij. Собрав воедино различные предложения, самым простым подходом для меня было:

  1. Убедитесь, что у вас есть sbt.Revolver в файле project / plugsin.sbt, например

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

  2. Установите javaoptions в файле build.sbt:

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

В частности, используйте параметр suspend = y. Это будет удерживать приложение, пока вы не подключите удаленный отладчик из Intellij.

  1. Настройте конфигурацию отладчика в Intellij через меню Run / Edit Configurations. Нажмите кнопку +, выберите опцию «Remote». Убедитесь, что записи соответствуют указанным выше javaoptions, в частности, адресу порта 5005. Дайте конфигурации имя, например, «Spray».

  2. На консоли SBT используйте команду перезапуска. Вы должны увидеть адрес порта 5005 в выходных данных обратной связи.

  3. В Intellij установите точки останова.

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

  5. Помните, что некоторые из директив Get в Spray, похоже, выполняются при запуске, но не повторно при вызове веб-сайта.

Херц
источник
благослови вас за этот ответ! работал как шарм.
user2770362
3

Для чего стоит Windows, отредактируйте %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

Файл-> Настройки-> Другие настройки-> Параметры SBT VM -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005

Выполнить-> Изменить конфигурации Нажмите +, а затем выберите удаленный Нажмите Применить

Теперь в консоли SBT (запущенной внутри intelliJ) при выполнении команды 'run' вы увидите "Прослушивание транспорта dt_socket по адресу: 5005"

Теперь нажмите Run-> Debug. Вы увидите, что меню отладки ниже активированы. В нем есть две вкладки Отладчик и Консоль.

Используйте F7 для перехода от следующей строки к следующей

Я выбрал Suspend. Поскольку это было y, когда я запустил команду запуска, он застрял

rayfish
источник
1
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

попробуй это

Шэншань Чжан
источник
0

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

  1. В Настройки -> SBT -> Вставить строку ниже в текстовом поле Параметры ВМ:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 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списке и нажмите Debug .

    Примечание. Вы должны увидеть открытое представление отладки, а в консоли отладки вы должны увидеть «Подключено к целевой виртуальной машине, адрес:, '127.0.0.1:5005'транспорт: 'сокет'»

  5. Поместите точки останова в несколько тестовых случаев в своем Testclass.

  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 01
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: \ Program Files (x86) \ sbt \
[или там, где установлен sbt]

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

[по примеру RT IntelliJ]

Добавить в путь:% SBT_HOME% \ bin;% SBT_OPTS%

Затем выполните следующую команду в командной строке в папке проекта «sbt run -jvm -debug 5005».

Если это работает правильно, командная строка сначала выведет строку «Прослушивание транспорта dt_socket по адресу: 5005».

Установите точку останова в IntelliJ.

Откройте веб-сайт в браузере, чтобы активировать точку останова отладчика, например « http: // localhost: 9000 / ».

decdev2012
источник