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

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

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

12 ответов


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

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

-отладчик xdebug - Xrunjdwp: transport=dt_socket, server=y, suspend=n, адрес=5005

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


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

sbt -jvm-debug 5005

под одеялом, это запускает JVM для SBT с типичным многословным отладочным заклинанием:

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

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

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

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

Remote Debug configuration in IntelliJ


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

настройка

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

    • перейти к Run > редактировать конфигурации
    • щелкните значок [ + ] и выберите Scala Compilation Server
    • введите любое имя, которое вы хотите, и нажмите кнопку "Запустить SBT Action" флажок и выберите SBT Action jetty-run от [...]
  2. создайте конфигурацию отладки для удаленной отладки

    • перейти к Run > редактировать конфигурации
    • щелкните значок [ + ] и выберите 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 в поле параметров VM, после тех, которые уже есть

отладка

  1. установить точки останова по желанию
  2. запустите веб-сервер jetty, выбрав конфигурацию SBT jetty-run, созданную выше, и выбрав Run > Run или нажав зеленую стрелку
  3. запустите удаленный отладчик, выбрав созданную конфигурацию удаленной отладки выше и выберите Run > Debug или нажмите значок ошибки

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

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

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


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

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

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


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

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

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

Мое Окружение: 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 (который вы настроили на Шаге 1). Если вы используете SBT вне IntelliJ (на командная строка), вам нужно будет запустить SBT с теми же параметрами VM с шага 1 (я этого не делал; поэтому никаких инструкций). После этого шага SBT теперь работает (но ваш код еще нет), и JVM настроен для удаленной отладки.
  4. это запускает средство отладки IntelliJ, которое подключается к JVM, запущенному на Шаге 3.
  5. наконец, вы начинаете компиляцию в консоли SBT. Это можно сделать с помощью любой команды компиляции, включая непрерывную компиляцию команда. При непрерывной повторной компиляции повторная компиляция произойдет, но не во время приостановки выполнения кода отладчиком.

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


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

  1. убедитесь, что у вас есть sbt.Револьвер в вашем проекте / plugsin.SBT файл, например,

    addSbtPlugin ("io.спрей " % "sbt-револьвер" % "0.7.1")

  2. установить javaoptions в вас построить.sbt файл:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp:транспорт=dt_socket,Server в=г,приостановить=г, - адрес=5005")

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

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

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

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

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

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


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

Выполнить - >Изменить Конфигурации Нажмите + и выберите remote Нажмите Apply

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

теперь нажмите Run - >Debug. Вы увидите debug меню ниже активировано. Он имеет две вкладки Debugger и Console.

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

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


для чего это стоит Windows folk, edit %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% фактически существует вне этого скрипта, если вы не создали явно в своей среде, но в любом случае вы получаете точку :D


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

  1. в настройке - > SBT - > Вставлено ниже строки в текстовом поле параметры VM:

    -начала XX:MaxPermSize=384M -отладчик xdebug -Xrunjdwp:транспорт=dt_socket,Server, в=г,приостановить=Н-адрес=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 список и нажмите отладка.

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

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

  6. приходите в терминал, где вы бежите"sbt -jvm-debug 5005 " и бегите, как ниже

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

    например: com.мой проект.модуль.AddServiceTest[Spec]

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


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

попробуй такое