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

92

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

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

  • 6
    Пожалуйста, не смешивайте вопросы в будущем
Теги:
intellij-idea
sbt
jetty

11 ответов

38
Лучший ответ

Для обычной отладки в 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/…
  • 0
    Где вы печатаете это? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Показать ещё 3 комментария
124

В официальном 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 наполовину вниз:

Изображение 6068

  • 1
    Это не работает на Windows - есть идеи, как сделать подобное на этой (паршивой) платформе?
  • 0
    Это сценарий запуска, который, я считаю, используется для Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Я бы посоветовал вам выяснить, как изменить скрипт, чтобы он принимал параметр -jvm-debug , и отправьте его как запрос на извлечение - у вас есть хорошие шансы помочь всем, кто оказался на той же платформе.
Показать ещё 6 комментариев
38

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

НАСТРОЙКИ

  • Создайте конфигурацию запуска для 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, созданную выше, и выберите "Выполнить" > "Выполнить" или нажмите зеленую стрелку
  • Запустите удаленный отладчик, выбрав конфигурацию удаленной отладки, созданную выше, и выберите "Выполнить" > "Отладка" или щелкнув значок ошибки
  • 16
    в меню настроек нет сервера компиляции Scala. Так что мне нужно что-то особенное?
  • 0
    кажется, что step1 не требуется, я запускаю команду sbt -jvm-debug 5005 console , затем устанавливаю точку останова в intelllJ Idea, запускаю debug.
Показать ещё 1 комментарий
5

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

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

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

Моя окружающая среда: 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. Вы можете сделать это с помощью любой команды компиляции, включая команду непрерывной компиляции. Если непрерывная перекомпилировать, повторная компиляция произойдет, но не пока выполнение кода не будет приостановлено отладчиком.
  • 3
    ссылка не работает
5

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

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

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

  • 0
    то же самое, но плохо работает: stackoverflow.com/questions/16337745/…
  • 0
    знаете ли вы, как я могу запустить только один тест, если в тестовом классе есть несколько тестов? Не могли бы вы взглянуть на следующий вопрос stackoverflow.com/questions/54977741/…
4

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

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

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

3

Файл- > Настройки- > Другие настройки- > 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, он застрял

3

Я тоже пытался отлаживать 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, похоже, выполняются при запуске, но не раз на вызове веб-сайта.

3

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

2

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

0

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

  • В настройках → SBT → Вставка ниже строки в текстовом поле Параметры VM:

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

  • Открыть Termilal в IntelliJ и запустить:

    sbt -jvm-debug 5005

Примечание: вы должны увидеть эту строку в терминале: "Прослушивание транспорта dt_socket по адресу: 5005" 3. Редактирование конфигураций → Нажмите + → Выбрать 'Remote'

    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.
  1. Выберите DebugMyModule в списке Edit Configurations и нажмите Отладка.

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

  1. Поместите контрольные точки в несколько тестовых примеров в тестовом классе.

  2. Приходите на терминал, где вы запускаете "sbt -jvm-debug 5005" и запускаете, как показано ниже

    проект it: testOnly package.TestSpec

ex: com.myproject.module.AddServiceTest [Spec]

  1. Вы можете увидеть отладочную версию в контрольной точке тестового примера.

Я надеюсь, что это поможет вам.

  • 0
    Не работает с Ubuntu 16.04 и IntelliJ 2017.3, отладчик подключается, но точки останова игнорируются.
  • 0
    testSuite не может остановиться на точке останова, однако, если точка останова находится в основном методе, она может.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню