Отладка Scala кода с помощью simple-build-tool (sbt) и IntelliJ

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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 наполовину вниз:

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

Ответ 3

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

НАСТРОЙКИ

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

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

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

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

DEBUGGING

  • Установить точки останова по желанию
  • Запустите веб-сервер причала, выбирая конфигурацию запуска sbt, созданную выше, и выберите "Выполнить" > "Выполнить" или нажмите зеленую стрелку
  • Запустите удаленный отладчик, выбрав конфигурацию удаленной отладки, созданную выше, и выберите "Выполнить" > "Отладка" или щелкнув значок ошибки

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Моя окружающая среда: Scala 2.10.2, SBT 0.13 и IntelliJ 13.1

Фон:

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

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

  • Отладка - это режим, в котором вы можете запускать JVM или приложение, которое позволяет вам управлять потоком выполнения кода.
  • Инструмент отладки, который вы используете, может затем выдавать команды в модуль отладки, который сообщает ему: "выполнить следующую строку кода, а затем снова приостановить" или "продолжить выполнение" или "получить значение переменной, хранящейся здесь в памяти".

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

  • Удаленная отладка отлаживается через сетевое соединение (сокет).
  • Это сетевое подключение позволяет вам выдавать команды отладчику с удаленной машины.
  • Это полезно, когда вы хотите отлаживать код, выполняющийся на удаленном сервере, НО
  • Он также полезен для ситуаций, таких как Scala, код под SBT и запуск через веб-сервер, например Jetty или Tomcat, отдельно от среды IntelliJ.

Ссылаясь на ссылку выше, следующие пояснения/изменения полезны:

  • Настройка IntelliJ для запуска SBT с настройками JVM "enable debugging", включая порт, который будет использоваться при настройке сетевого сокета. (без изменений) добавьте именованные параметры VM в настройки IntelliJ.
  • Убедитесь, что ваш номер порта соответствует вашим настройкам JVM с шага 1.
  • Когда вы запускаете SBT, вам нужно сделать это из плагина SBT Console (который вы настроили на шаге 1). Если вы используете SBT вне IntelliJ (в командной строке), вам нужно запустить SBT с теми же параметрами VM с шага 1 (я этого не делал, поэтому никаких инструкций). После этого шага SBT теперь работает (но ваш код еще не установлен), а JVM настроен для удаленной отладки.
  • Это запускает IntelliJ Debugging Tool, который подключается к JVM, запущенному на шаге 3.
  • Наконец, вы начинаете компиляцию в консоли SBT. Вы можете сделать это с помощью любой команды компиляции, включая команду непрерывной компиляции. Если непрерывная перекомпилировать, повторная компиляция произойдет, но не пока выполнение кода не будет приостановлено отладчиком.

Ответ 8

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

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

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

  • Установите 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. Дайте конфигурации имя типа "Спрей".

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

  3. В Intellij задайте точки останова.

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

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

Ответ 9

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

Run- > Edit Configurations     Нажмите +, а затем выберите     Нажмите Применить

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

Теперь нажмите Run- > Debug. После активации вы увидите отладочные меню. Он имеет две вкладки Debugger и Console.

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

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

Ответ 10

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

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

Ответ 11

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

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

    -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 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 " и запускаете, как sbt -jvm-debug 5005 ниже

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

    Например: com.myproject.module.AddServiceTest [Spec]

  7. Вы можете увидеть, что отладка запущена в контрольной точке вашего теста.

Ответ 12

export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

попробуй это

Ответ 13

В соответствии с ответом Роберто Тайлэй выше, но в 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".

Если это работает должным образом, командная строка первоначально выведет строку re "Listening для транспорта dt_socket по адресу: 5005".

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

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