Я пишу код 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 года, но сосредоточился на запуске модульного теста. У меня тот же вопрос; к сожалению, пока никто на него не ответил.
@CrazyCoder, великолепно! Да, это направляет меня на правильный путь. Спасибо.





Ключевая идея @CrazyCoder заключается в том, что мельница запускает подпроцесс для запуска кода. Это процесс, который необходимо связать.
Итак, вот шаги:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005mill cli.run, поэтому мне нужен объект cli в моем файле сборки.override def forkArgs = Seq("..."), заменив ... строкой, которую вы скопировали из IntelliJ. forkArgs задокументировано здесь. При необходимости найдите в документации forkArgs.suspend=n, который IntelliJ предложил suspend=y.forkArgs в соответствующие объекты в файле сборки. Или добавьте это в черту :)Было бы неплохо иметь возможность переключать настройки отладки из командной строки мельницы. Пока я не придумал, как это сделать. Идеи приветствуются.
Что касается дополнения о переключении параметров отладки из командной строки, см. stackoverflow.com/questions/78318732/… для частичного решения.
Я не знаю, новая ли это разработка или просто неочевидный пользовательский интерфейс, но если у вас есть метод @main, рядом с ним в желобе есть небольшой значок воспроизведения, который позволяет запускать или отлаживать его. После этого он переходит в настройки запуска.
(Я использую мельницу через BSP, ./mill mill.bsp.BSP/install, а не интеграцию, специфичную для Intellij)
Вы проверили, является ли это одним процессом JVM и подключаетесь ли вы к JVM, в которую действительно загружены ваши классы? Платформа тестирования может создать новый процесс JVM, который не будет наследовать параметры отладчика. Возможно, вы подключаетесь к родительскому процессу JVM, который не запускает ваш код, поэтому точки останова не работают.