Отладка кода Scala с помощью simple-build-tool (sbt) и IntelliJ
каков самый простой способ отладки кода Scala, управляемого sbt с помощью встроенного отладчика IntelliJ? Документация от "RunningSbt" с сайта google кода sbt перечисляет команды для запуска основного класса для проекта или тестов, но, похоже, нет команд для отладки.
последующий вопрос: каков самый простой способ подключить отладчик IntelliJ к Jetty при использовании команды jetty-run sbt?
12 ответов:
для обычной отладки в IntelliJ вы можете использовать конфигурацию запуска/отладки приложения обычным способом, независимо от того, используете ли вы sbt для компиляции кода.
для подключения к приложению, работающему в Jetty, вам необходимо создать конфигурацию удаленной отладки. Когда вы это сделаете, IntelliJ предоставит вам набор аргументов командной строки для запуска удаленного JVM - что-то вроде
- Xdebug - Xrunjdwp: transport=dt_socket, server=y, suspend=n, address=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 поля в этой форме, в то время как страшно, только для вас, чтобы скопировать текст из of, а не into (они дают подробное отладочное заклинание, указанное выше, которое
-jvm-debugуже заботится о вас) - единственная конфигурация, которую вы можете изменить, находится вSettingsраздел на полпути вниз:
у меня тоже были некоторые проблемы с этим, поэтому, рискуя быть слишком подробным, вот что я сделал:
настройка
создать конфигурацию запуска для SBT jetty-run
- перейти к запуску > редактировать конфигурации
- щелкните значок [ + ] и выберите Scala Compilation Server
- введите любое имя, которое вы хотите, и нажмите кнопку" Запустить SBT Action " флажок и выберите SBT Action jetty-run от [...]
создать конфигурацию отладки для удаленной отладки
- перейти к запуску > редактировать конфигурации
- щелкните значок [ + ] и выберите Remote
- введите любое имя, которое вы хотите, и скопируйте строку
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(обязательно нажмите кнопку ОК, чтобы создать конфигурацию)настройка плагина sbt для запуска параметров виртуальной машины выше
- перейти к файлу > настройки > СБТ
- вставить строку
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005в поле параметры виртуальной машины, после тех, которые уже естьотладка
- установите точки останова по желанию
- запустите веб-сервер jetty, выбрав конфигурацию sbt jetty-run, созданную выше, и выбрав Run > Run или нажав зеленую стрелку
- запустите удаленный отладчик, выбрав созданную конфигурацию удаленной отладки выше и выберите Выполнить > отладка или щелкнув значок ошибки
Я добавляю еще один ответ здесь, потому что я нашел этот вопрос при поиске связанной проблемы: отладка тестовых классов с использованием точек останова.
Я использую ScalaTest, и я обычно запускаю набор, используя команду sbt "только для тестирования". Теперь, когда я хочу использовать интерактивный отладчик, я могу сделать следующее:
создать новый запуск/отладка конфигурации ScalaTest "тип", поставлена главная "тест-класса:" имя, и выберите "перед запуском: тест-компиляции выполнения действий "СБТ"''". Это теперь вы можете разместить точки останова в источниках тестов и запустить эту конфигурацию.
это работает для меня каждый раз, и единственное, что вам нужно настроить, это удаленная отладка в 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.
ссылаясь на ссылку выше, следующие объяснения/изменения полезны:
- настройка IntelliJ для запуска SBT с настройками JVM "включить отладку", включая порт для использования при настройке сетевого сокета. (без изменений) добавьте именованные параметры виртуальной машины в настройки IntelliJ.
- убедитесь, что ваш номер порта здесь соответствует вашим настройкам JVM с шага 1.
- когда вы запускаете SBT, вам нужно сделать это из плагина консоли SBT (который вы настроили на Шаге 1). Если вы используете SBT за пределами IntelliJ (на командная строка), вам нужно будет запустить SBT с теми же параметрами виртуальной машины с шага 1 (я этого не делал, поэтому никаких инструкций). После этого шага SBT теперь работает (но ваш код еще не запущен), а JVM настроен для удаленной отладки.
- запускается средство отладки IntelliJ, которое подключается к JVM, запущенному на Шаге 3.
- наконец, вы начинаете компиляцию в консоли 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. Собирая воедино различные предложения, самый простой подход для меня был:
убедитесь, что у вас есть sbt.Револьвер в вашем проекте / plugsin.SBT файл, например,
addSbtPlugin ("io.брызги " % "sbt-револьвер" % "0.7.1")
установить javaoptions в вас построить.sbt file:
javaOptions: = Seq ("- Xdebug", "- Xrunjdwp: transport=dt_socket, server=y, suspend=y, address=5005")
в частности, используйте параметр suspend=y. Это будет держать приложение, пока вы не подключите удаленный отладчик с Intellij
настройка конфигурации отладчика в Intellij через меню Run / Edit Configuration. Нажмите кнопку+, выберите опцию "Remote". Убедитесь, что записи соответствуют javaoptions выше, в частности адрес порта 5005. Дайте конфигурации имя типа "Спрей".
с консоли SBT используйте команду повторного запуска. Вы должны увидеть адрес порта 5005 в выходе обратной связи.
в Intellij установите точки останова.
в Intellij выберите Run \ Debug 'Spray'. Это должно подключиться к веб-серверу распылителя. Вы должны быть в состоянии видеть много потоков в окне отладки.
будьте осторожны, что некоторые из получить директивы в спрей кажется, что он выполняется при запуске, но не повторно при вызове веб-сайта.
Файл - > Настройки - > другие настройки - >SBT Параметры виртуальной машины -Xmx512M -начала XX:MaxPermSize=256 МБ -отладчик xdebug -Xrunjdwp:транспорт=dt_socket,Server, в=г,приостановить=Н-адрес=5005
Выполнить - > Изменить Конфигурации Нажмите + , а затем выберите удаленный Нажмите Применить
теперь в консоли SBT (запускается внутри intelliJ) при выполнении команды ' run ' вы увидите "прослушивание транспорта dt_socket по адресу: 5005"
теперь нажмите Run - > Debug. Вы увидите отладку меню ниже активировано. Он имеет две вкладки отладчик и консоль.
используйте F7 для перехода от следующей строки к следующей
Я выбрал suspend, чтобы быть n. с ним было y, когда я запустил команду 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 launcherNB. Я не думаю
%SBT_HOME%на самом деле существует вне этого скрипта, если вы не создали явно в вашей среде, но в любом случае вы получите точку :D
Я также получил ту же проблему, я хотел бы поделиться, как я решил. Кстати я использую Ubuntu 14.04 и IntelliJ 15.
в настройках - > SBT - > Вставляется ниже строки в текстовое поле параметры виртуальной машины:
-начала XX:MaxPermSize=384M -отладчик xdebug -Xrunjdwp:транспорт=dt_socket,Server, в=г,приостановить=Н-адрес=5005
открыл Термилал в IntelliJ и запустил:
sbt-jvm-debug 5005
Примечание: вы должны увидеть эта строка в терминале: "прослушивание транспорта dt_socket по адресу: 5005"
Редактировать Конфигурации - > Нажмите + - > Выберите "Удаленный"
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.выберите DebugMyModule на
Edit Configurationsсписок и нажмите кнопку Debug.Примечание: вы должны увидеть Debug View открыт и в консоли отладки вы должны иметь возможность увидеть " подключен к целевой виртуальной машине, адрес:
'127.0.0.1:5005', транспортный: 'socket'"поместите точки останова в несколько тестовых случаев в вашем тестовом классе.
подойдите к терминалу, где вы работаете"
sbt -jvm-debug 5005" и бежать, как нижеproject <your-module-name> it:testOnly package.TestSpecнапример: com.мой проект.модуль.AddServiceTest[Spec]
вы можете увидеть отладку, запущенную в точке останова тестового набора.

Comments