Отладка кода Scala с помощью простого средства сборки (sbt) и IntelliJ - PullRequest
113 голосов
/ 11 ноября 2010

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

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

Ответы [ 13 ]

171 голосов
/ 19 марта 2013

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

sbt -jvm-debug 5005

Под крышками , это запускает JVM для SBT с типичным подробным заклинанием отладки:

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

Теперь вы можете запускать свой код в обычном режиме, например, с помощью команды sbt run.

Настройка IntelliJ для подключения к исполняемому коду ...

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

Remote Debug configuration in IntelliJ

45 голосов
/ 11 ноября 2010

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

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

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

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

39 голосов
/ 26 мая 2011

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

SETUP

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

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

    • Перейти в «Выполнить»> «Редактировать конфигурации»
    • Нажмите значок [+] и выберите Удаленный
    • Введите любое имя и скопируйте строку -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. Запустите веб-сервер jetty, выбрав конфигурацию sbt jetty-run, которую вы создали выше, и выбрав Run> Run или нажав зеленую стрелку
  3. Запустите удаленный отладчик, выбрав созданную выше конфигурацию удаленной отладки и выбрав «Выполнить»> «Отладка», или щелкнув значок ошибки
7 голосов
/ 20 июля 2011

Я добавляю еще один ответ, потому что нашел этот вопрос при поиске связанной проблемы: отладка тестовых классов с использованием точек останова.

Я использую ScalaTest и обычно запускаю комплект с помощью команды sbt 'только для тестирования'. Теперь, когда я хочу использовать интерактивный отладчик, я могу сделать следующее:

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

6 голосов
/ 02 декабря 2015

Это работает для меня каждый раз, и вам нужно только настроить удаленную отладку в IntelliJ;Я запускаю SBT с параметрами JVM из терминала в IntelliJ:

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

После этого я могу начать удаленную отладку на локальном хосте: 5005

5 голосов
/ 14 августа 2014

Ни один из этих ответов или предоставленных ссылок не работал для меня, поэтому, как только я понял это, я решил поделиться ...

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

Это основано главным образом на инструкциях здесь только с дополнительным объяснением, которое провело меня через это.

Моя среда: Scala 2.10.2, SBT 0.13 и IntelliJ 13.1

Справочная информация:

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

Что такое отладка?

  • Отладка - это режим, в котором вы можете запустить JVM или приложение, в котором вы можете контролировать поток выполнения кода.
  • Средство отладки, которое вы используете, может затем выдавать команды в механизм отладки, который говорит ему: «выполнить следующую строку кода, затем снова сделать паузу», «продолжить выполнение» или «получить значение переменной, хранящейся здесь в памяти». 1027 *

Что такое удаленная отладка?

  • Удаленная отладка - отладка по сетевому соединению (сокет).
  • Это сетевое соединение позволяет вам выдавать команды в модуль отладки с удаленного компьютера.
  • Это полезно для отладки кода, который выполняется на удаленном сервере, НО
  • Это также полезно для ситуаций, таких как код 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. Вы можете сделать это с помощью любой команды компиляции, включая команду непрерывной компиляции. В случае непрерывной повторной компиляции происходит повторная компиляция, но не в то время, когда отладчик приостанавливает выполнение кода.
3 голосов
/ 26 сентября 2015

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

Run-> Edit Configurations Нажмите +, а затем выберите удаленный. Нажмите Apply

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

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

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

Я выбрал suspend, чтобы быть n.Когда я запустил команду запуска, он застрял

3 голосов
/ 14 января 2015

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

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

    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. Нажмите кнопку +, выберите опцию «Пульт». Убедитесь, что записи соответствуют приведенным выше javaoptions, в частности адрес порта 5005. Присвойте конфигурации имя, например «Spray».

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

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

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

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

3 голосов
/ 31 января 2014

Используя Scala 2.10 и SBT 0.12, я работал так: http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html

2 голосов
/ 30 января 2015

Для чего стоит 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

...