scala、工厂构建工具和 IntelliJ 调试器

问题描述 投票:0回答:1

我正在编写 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 月提出了一个“类似的问题”,但重点是运行单元测试。我也有同样的问题;不幸的是还没有人回答。

scala intellij-idea mill
1个回答
0
投票
这就是

需要连接的流程。 因此,步骤如下:

在 IntelliJ 中:

创建调试配置。从“运行 -> 编辑配置”开始
  • 单击左上角的“+”。从出现的下拉菜单中选择“远程 JVM 调试”
  • 为其命名,例如“远程调试”。
  • 保留其他所有内容,但复制标记为“远程 JVM 的命令行参数:”的只读字段。就我而言(也可能是你的情况)
  • -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
  • 行。或者将其添加到特征中:)
    
    
  • 进行调试:

像往常一样用 mill 运行你的程序。它应该打印行“正在地址:5005 监听传输 dt_socket”,然后暂停。
  • 切换到 IntelliJ 并设置断点。
  • 单击IntelliJ菜单栏右端的调试图标:
  • 您的程序应该运行直到遇到断点。切换到调试器并进城!
  • 附录:

如果能够从工厂命令行切换调试设置,那就太好了。到目前为止,我还没有弄清楚如何做到这一点。欢迎提出想法。

© www.soinside.com 2019 - 2024. All rights reserved.