我正在编写 Scala 代码并使用 Mill 构建工具。我希望能够使用 IntelliJ 的调试器来调试我的代码,但无法说服它在断点处停止。
我已经在 IntelliJ 中设置了远程调试配置。我已将建议的 Java 命令行参数复制/粘贴到我用来运行 Mill 的脚本中:
#!/bin/zsh
export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005"
mill $@
当我使用 Mill 运行程序时,程序会停止并等待调试器连接。然后,尽管设置了断点,它仍会运行到完成。
第 17 行的
println
被执行。
Mill 的
build.sc
文件本身很简单:
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 年 10 月提出了一个“类似的问题”,但重点是运行单元测试。我也有同样的问题;不幸的是还没有人回答。
需要连接的流程。 因此,步骤如下:
在 IntelliJ 中:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
mill cli.run
cli
对象。添加 override def forkArgs = Seq("...")
...
替换为您从 IntelliJ 复制的行。 forkArgs
记录在here。如有必要,请在文档中搜索
forkArgs
。就我而言,我希望程序暂停执行,直到我有时间连接调试器(即它不是像 Web 服务器那样长时间运行的进程)。所以我将 IntelliJ 建议的 suspend=n
suspend=y
。如果您还想在测试套件中调试测试,则需要在构建文件的相应对象中再次添加 forkArgs