Какой самый простой способ отладить Scala код, управляемый sbt с помощью встроенного отладчика IntelliJ? Документация из "RunningSbt" с сайта сайта google google содержит команды для запуска основного класса для проекта или тестов, но, похоже, нет команды для отладки.
Последующий вопрос: какой самый простой способ подключить отладчик IntelliJ к Jetty при использовании команды sbt jetty-run?
Для обычной отладки в IntelliJ вы можете использовать конфигурацию запуска/отладки приложения обычным способом, независимо от того, используете ли вы sbt для компиляции вашего кода.
Чтобы подключиться к вашему приложению, запущенному в Jetty, вам необходимо создать конфигурацию удаленного отладки. Когда вы это сделаете, IntelliJ предоставит вам набор аргументов командной строки для запуска удаленного JVM - что-то вроде
-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005
Запустите sbt с этими аргументами, а затем выполните jetty-run
. Наконец, запустите удаленную конфигурацию отладки в IntelliJ. Этот поток может быть полезен.
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
В официальном 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 к вашему запущенному процессу, используя Удаленная конфигурация отладки. Обратите внимание, что верхние 3 поля в этой форме, в то время как страшные, предназначены только для копирования текста, а не в (они дают подробное заклинание отладки, указанное выше, которое -jvm-debug
уже заботится о вас) - единственная конфигурация, которую вы можете изменить, находится в секции Settings
наполовину вниз:
-jvm-debug
, и отправьте его как запрос на извлечение - у вас есть хорошие шансы помочь всем, кто оказался на той же платформе.
У меня были проблемы с этим, так что, рискуя быть слишком подробными, вот что я сделал:
НАСТРОЙКИ
Создайте конфигурацию запуска для sbt jetty-run
Создайте конфигурацию отладки для удаленной отладки
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
(обязательно нажмите OK, чтобы создать конфигурацию)Настройте плагин sbt для запуска опций vm выше
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
в поле параметров VM, после тех, которые уже существуютDEBUGGING
sbt -jvm-debug 5005 console
, затем устанавливаю точку останова в intelllJ Idea, запускаю debug.
Ни один из этих ответов или предоставленных ссылок не работал у меня, поэтому, как только я понял это, я решил, что поделился бы...
включая понимание фона, которое у меня не было, когда я начал...
Это основано в основном на инструкциях здесь только с дополнительным объяснением, которое перенесло меня через него.
Моя окружающая среда: 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. Вы можете сделать это с помощью любой команды компиляции, включая команду непрерывной компиляции. Если непрерывная перекомпилировать, повторная компиляция произойдет, но не пока выполнение кода не будет приостановлено отладчиком.
Я добавляю еще один ответ здесь, потому что я нашел этот вопрос при поиске связанной проблемы: Отладка тестовых классов с использованием контрольных точек.
Я использую ScalaTest, и я обычно запускаю пакет, используя команду sbt 'test-only'. Теперь, когда я хочу использовать интерактивный отладчик, я могу сделать следующее:
Создайте новую конфигурацию Run/Debug типа "ScalaTest", поместите основное имя "Test Class:" и выберите "Before launch: Run SBT Action" test-compile "". Для этого вы можете разместить точки останова в тестовых источниках и запустить эту конфигурацию.
Это работает для меня каждый раз, и единственное, что вам нужно настроить - это удаленная отладка в IntelliJ; Я запускаю SBT с параметрами JVM с терминала в IntelliJ:
sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
После этого я могу начать удаленную отладку на localhost: 5005
Файл- > Настройки- > Другие настройки- > 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, он застрял
Я тоже пытался отлаживать 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
Настройте конфигурацию отладчика в Intellij через меню Run/Edit Configurations. Нажмите кнопку +, выберите опцию "Remote". Убедитесь, что записи соответствуют указанным выше javaoptions, в частности, адресу порта 5005. Дайте конфигурации имя типа "Спрей".
С вашей консоли SBT используйте команду повторного запуска. Вы должны увидеть адрес порта 5005 в выходном сигнале обратной связи.
В Intellij задайте точки останова.
Из Intellij выберите Run\Debug 'Spray'. Это должно быть подключено к веб-серверу с распылителем. Вы должны увидеть много потоков в окне отладки.
Остерегайтесь того, что некоторые из директив Get в Spray, похоже, выполняются при запуске, но не раз на вызове веб-сайта.
Используя Scala 2.10 и SBT 0.12, я начал работать следующим образом: http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html
Для чего стоит 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
У меня тоже такая же проблема, мне нравится делиться тем, как я решил. Кстати, я использую 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.
Edit Configurations
и нажмите Отладка. Примечание.. Вы должны увидеть, что Debug View открыт и в консоли отладки. Вы должны увидеть "Подключено к целевой VM, адрес: '127.0.0.1:5005'
, транспорт:" сокет "
Поместите контрольные точки в несколько тестовых примеров в тестовом классе.
Приходите на терминал, где вы запускаете "sbt -jvm-debug 5005
" и запускаете, как показано ниже
проект it: testOnly package.TestSpec
ex: com.myproject.module.AddServiceTest [Spec]
Я надеюсь, что это поможет вам.