Scala, инструмент сборки мельницы и отладчик IntelliJ

Я пишу код Scala и использую инструмент сборки Mill. Я хотел бы иметь возможность использовать отладчик IntelliJ для отладки моего кода, но не смог убедить его остановиться в точках останова.

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

#!/bin/zsh

export JAVA_OPTS = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005"
mill $@

Когда я запускаю программу с помощью Mill, она останавливается и ждет подключения отладчика. Затем он выполняется до завершения, несмотря на установленные точки останова.

println в строке 17 выполняется.

Файл build.sc для Mill сам по себе прост:

import mill._, scalalib._

object foo extends RootModule with ScalaModule {
  def scalaVersion = "3.3.3"
  def ivyDeps = Agg(
    ivy"com.lihaoyi::os-lib:0.9.3",
    ivy"com.github.scopt::scopt:4.1.0",
    ivy"ca.uwaterloo::da_solver:0.4.0-SNAPSHOT"
  )

  object test extends ScalaTests {
    def ivyDeps       = Agg(ivy"com.lihaoyi::utest:0.7.11")
    def testFramework = "utest.runner.Framework"
  }
}

Одна из вещей, которые меня интересуют, - это настройка «Использовать путь к классам модуля:»

По умолчанию это <no module>. Я пробовал этот и другие варианты, все с одинаковыми результатами (точки останова пропущены).

Какие-либо предложения?

Я нашел этот пост на StackOverflow об использовании отладчика IntelliJ действительно полезным, за исключением вышеперечисленного. Пользователь @user3416742 задал аналогичный вопрос в октябре 2023 года, но сосредоточился на запуске модульного теста. У меня тот же вопрос; к сожалению, пока никто на него не ответил.

Вы проверили, является ли это одним процессом JVM и подключаетесь ли вы к JVM, в которую действительно загружены ваши классы? Платформа тестирования может создать новый процесс JVM, который не будет наследовать параметры отладчика. Возможно, вы подключаетесь к родительскому процессу JVM, который не запускает ваш код, поэтому точки останова не работают.

CrazyCoder 11.04.2024 21:09

@CrazyCoder, великолепно! Да, это направляет меня на правильный путь. Спасибо.

bwbecker 11.04.2024 21:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ключевая идея @CrazyCoder заключается в том, что мельница запускает подпроцесс для запуска кода. Это процесс, который необходимо связать.

Итак, вот шаги:

В IntelliJ:

  • Создайте отладочную конфигурацию. Начните с «Выполнить -> Изменить конфигурации».
  • Нажмите «+» в левом верхнем углу. В появившемся раскрывающемся меню выберите «Удаленная отладка JVM».
  • Дайте ему имя, например «удаленная отладка».
  • Оставьте все остальное, но скопируйте доступное только для чтения поле с надписью «Аргументы командной строки для удаленной JVM:». В моем случае (и, возможно, в вашем) -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
  • Закройте диалог.

В файле сборки мельницы:

  • Найдите в файле сборки объект, который используется для запуска кода. В моем случае моя командная строка — mill cli.run, поэтому мне нужен объект cli в моем файле сборки.
  • Добавьте override def forkArgs = Seq("..."), заменив ... строкой, которую вы скопировали из IntelliJ. forkArgs задокументировано здесь. При необходимости найдите в документации forkArgs.
  • В моем случае я хочу, чтобы программа приостановила выполнение до тех пор, пока у меня не будет времени подключиться к отладчику (т. е. это не такой длительный процесс, как веб-сервер). Поэтому я изменил suspend=n, который IntelliJ предложил suspend=y.
  • Если вы также хотите отлаживать тесты в наборе тестов, вам нужно снова добавить строку forkArgs в соответствующие объекты в файле сборки. Или добавьте это в черту :)

Чтобы выполнить отладку:

  • Запустите программу как обычно с помощью mill. Он должен напечатать строку «Прослушивание транспорта dt_socket по адресу: 5005», а затем сделать паузу.
  • Переключитесь на IntelliJ и установите точки останова.
  • Нажмите значок отладки в правом конце строки меню IntelliJ:
  • Ваша программа должна работать до тех пор, пока не достигнет точки останова. Переключитесь на отладчик и вперед в город!

Приложение:

Было бы неплохо иметь возможность переключать настройки отладки из командной строки мельницы. Пока я не придумал, как это сделать. Идеи приветствуются.

Что касается дополнения о переключении параметров отладки из командной строки, см. stackoverflow.com/questions/78318732/… для частичного решения.

bwbecker 15.04.2024 17:05

Я не знаю, новая ли это разработка или просто неочевидный пользовательский интерфейс, но если у вас есть метод @main, рядом с ним в желобе есть небольшой значок воспроизведения, который позволяет запускать или отлаживать его. После этого он переходит в настройки запуска.

(Я использую мельницу через BSP, ./mill mill.bsp.BSP/install, а не интеграцию, специфичную для Intellij)

Другие вопросы по теме