使用 IntelliJ 的内置调试器调试 sbt 管理的 Scala 代码的最简单方法是什么?来自 sbt 的谷歌代码站点的“RunningSbt”文档列出了用于运行项目或测试的主类的命令,但似乎没有用于调试的命令。
后续问题:使用 sbt 的 jetty-run 命令时,将 IntelliJ 的调试器附加到 Jetty 的最简单方法是什么?
使用 IntelliJ 的内置调试器调试 sbt 管理的 Scala 代码的最简单方法是什么?来自 sbt 的谷歌代码站点的“RunningSbt”文档列出了用于运行项目或测试的主类的命令,但似乎没有用于调试的命令。
后续问题:使用 sbt 的 jetty-run 命令时,将 IntelliJ 的调试器附加到 Jetty 的最简单方法是什么?
Mac、Linux 和Windows-jvm-debug
的官方SBT 包中有一个非常方便的标志。您可以使用该标志来指定调试端口:
sbt -jvm-debug 5005
在幕后,这会以典型的详细调试咒语启动 SBT 的 JVM:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
您现在可以正常运行代码,例如使用 sbtrun
命令。
现在您使用远程调试配置将 IntelliJ 连接到正在运行的进程。请注意,此表单中的前 3 个字段虽然很吓人,但仅供您将文本复制出来,而不是复制到其中(它们提供了上面指定的详细调试咒语,-jvm-debug
已经为您处理好了)-唯一的配置您可以在Settings
下半部分更改:
对于 IntelliJ 中的普通调试,您可以以通常的方式使用应用程序运行/调试配置,无论您是否使用 sbt 编译代码。
要连接到在 Jetty 中运行的应用程序,您需要创建远程调试配置。当您这样做时,IntelliJ 将为您提供一组用于运行远程 JVM 的命令行参数——类似于
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
使用这些参数启动 sbt 然后执行jetty-run
. 最后,在 IntelliJ 中启动远程调试配置。这个线程可能有用。
我也遇到了一些麻烦,所以冒着过于详细的风险,这就是我所做的:
设置
为 sbt jetty-run 创建运行配置
为远程调试创建调试配置
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
(确保单击“确定”以实际创建配置)设置 sbt 插件以运行上面的 vm 选项
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
VM 参数框中,在已经存在的参数之后调试
这个每次都对我有用,你唯一需要设置的是 IntelliJ 中的远程调试;我从 IntelliJ 的终端使用 JVM 参数启动 SBT:
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
背景:
- 无论出于何种原因,在 IntelliJ 中使用 SBT 编译 Scala 并没有像 Maven 项目那样集成(这使得调试非常容易)。
- 据我了解,使用 SBT 编译时,您是在单独的进程中编译,因此,您需要进行远程调试。
什么是调试?
- 调试是您可以运行 JVM 或应用程序的一种模式,它允许您控制代码执行流程。
- 然后,您使用的调试工具可以向调试引擎发出命令,告诉它“执行下一行代码然后再次暂停”或“继续执行”或“获取存储在内存中的变量的值”。
什么是远程调试?
- 远程调试是通过网络连接(套接字)进行调试。
- 此网络连接允许您从远程机器向调试引擎发出命令。
- 当您想要调试在远程服务器上运行的代码时,这很有用,但是
- 对于在 SBT 下运行的 Scala 代码并通过与 IntelliJ 环境分开的 Web 服务器(如 Jetty 或 Tomcat)启动等情况,它也很有用。
参考上面的链接,以下解释/修改很有用:
- 设置 IntelliJ 以使用“启用调试”JVM 设置启动 SBT,包括设置网络套接字时使用的端口。(未更改)将命名的 VM 参数添加到您的 IntelliJ 设置中。
- 确保此处的端口号与步骤 1 中的 JVM 设置相匹配。
- 当您启动 SBT 时,您需要从 SBT 控制台插件(这是您在步骤 1 中配置的)执行此操作。如果您在 IntelliJ 之外(在命令行)运行 SBT,则需要使用与步骤 1 中相同的 VM 参数启动 SBT(我没有这样做;所以没有说明)。在这一步之后,SBT 现在正在运行(但您的代码还没有)并且 JVM 已设置为远程调试。
- 这将启动 IntelliJ 调试工具,该工具连接到您在步骤 3 中启动的 JVM。
- 最后,在 SBT 控制台中开始编译。您可以使用任何编译命令执行此操作,包括连续编译命令。如果连续重新编译,将发生重新编译,但不会在调试器暂停代码执行时发生。
我在这里添加另一个答案,因为我在查找相关问题时发现了这个问题:Debugging test classes using breakpoints。
我正在使用 ScalaTest,我通常使用 sbt 的“仅测试”命令运行一个套件。现在,当我想使用交互式调试器时,可以执行以下操作:
创建一个类型为“ScalaTest”的新运行/调试配置,输入主“测试类:”名称,然后选择“启动前:运行 SBT 操作 'test-compile'”。就是这样,您现在可以在测试源中放置断点,并运行此配置。
我也一直在努力在 Windows 上使用 Intellij 通过 SBT 构建的 Spray-can / Akka / Scala 应用程序进行调试。将各种建议拼凑在一起,对我来说最简单的方法是:
确保您的项目/plugsin.sbt 文件中有 sbt.Revolver,例如
addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.1")
在 build.sbt 文件中设置 javaoptions:
javaOptions := Seq("-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005")
特别是使用suspend=y 选项。这将保留应用程序,直到您从 Intellij 连接远程调试器
通过 Run / Edit Configurations 菜单在 Intellij 中设置调试器配置。按+按钮,选择“远程”选项。确保条目与上面的 javaoptions 匹配,特别是 5005 的端口地址。为配置命名,如“Spray”。
从您的 SBT 控制台使用重新启动命令。您应该在反馈输出中看到 5005 端口地址。
在 Intellij 中设置断点。
在 Intellij 中,选择 Run \ Debug 'Spray'。这应该连接到喷雾罐网络服务器。您应该能够在调试窗口中看到很多线程。
请注意,Spray 中的某些 Get 指令似乎会在启动时执行,但不会在调用网站时重复执行。
对于 Windows 人员的价值,请编辑%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 脚本启动器中看到时,我能做的最好的事情是获得相同的行为
注意。我不认为%SBT_HOME%
实际上存在于这个脚本之外,除非你在你的环境中明确创建,但无论如何你明白了:D
文件->设置->其他设置->SBT VM参数-Xmx512M -XX:MaxPermSize=256M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
运行->编辑配置 按 + 然后选择远程 按应用
现在在 SBT 控制台(由 intelliJ 启动)中,当您执行命令“运行”时,您将看到“在地址侦听传输 dt_socket:5005”
现在按运行->调试。您将看到下面激活的调试菜单。它有两个选项卡调试器和控制台。
使用 F7 从下一行到下一行
我选择suspend为n。当我运行运行命令时它是 y,它被卡住了
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009
试试这个
AttachMe IntelliJ 插件可能是连接调试器的更快方法,而无需摆弄端口号:
即使您从终端(或任何其他方式)启动应用程序,AttachMe 也会自动附加 IntelliJ 调试器。您无需
Attach to process
手动触发操作。
博客文章和自述文件有设置说明,但是我必须稍微修改一下才能让它在我的机器上运行
从官方仓库下载installer.sh
脚本
curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
chmod u+x installer.sh
./installer.sh
/.config/attachme/agent.jar
并创建~/.attachme
文件修改~/.attachme
为包含
AM_JDWP_ARGS="transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
echo Using JDWP arguments ${AM_JDWP_ARGS}
export JAVA_TOOL_OPTIONS="- javaagent:/Users/mario_galic/.config/attachme/agent.jar -agentlib:jdwp=${AM_JDWP_ARGS}"
echo "AttachMe configured successfully"
安装对应的Attachme插件并重启:IntelliJ | Preferences | Plugins
Attachme
运行配置:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK
在这些一次性的恶作剧之后,我们可以通过以下方式自动附加一个调试器
Attachme
运行配置source ~/.attachme
sbt "runMain example.Hello"
我也遇到了同样的问题,分享一下我是怎么解决的。顺便说一句,我使用的是 Ubuntu 14.04 和 IntelliJ 15。
在设置 -> SBT -> 在 VM 参数文本框中粘贴以下行:
-XX:MaxPermSize=384M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
在 IntelliJ 中打开 Termilal 并运行:
sbt -jvm-调试 5005
注意:您应该在终端中看到这一行:“Listening for transport dt_socket at address: 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.
在列表框中选择DebugMyModuleEdit Configurations
并单击Debug。
注意:您应该会看到 Debug View 打开并在 Debug Console 中您应该能够看到“已连接到目标 VM,地址:'127.0.0.1:5005'
,传输:'socket'”
在 Testclass 的几个测试用例中放置断点。
来到你运行“ sbt -jvm-debug 5005
”的终端并运行如下
project <your-module-name>
it:testOnly package.TestSpec
例如:com.myproject.module.AddServiceTest[Spec]
您可以在测试用例断点中看到调试开始。
根据上面 Roberto Tyley 的回答,但在 Windows 中,我们还需要在安装 sbt 后设置以下环境变量:
SBT_HOME
C:\Program Files (x86)\sbt\
[或安装 sbt 的任何地方]
SBT_OPTS
-Xdebug -runjdwp:transport=dt_socket,server=y,suspend=n,address=5005
[根据 RT 的 IntelliJ 示例]
添加到路径:%SBT_HOME%\bin;%SBT_OPTS%
然后在项目文件夹“sbt run -jvm -debug 5005”的命令行中运行以下命令。
如果这工作正常,命令行最初将输出一行 re“Listening for transport dt_socket at address: 5005”。
在 IntelliJ 中设置断点。
在浏览器中打开网站以触发调试器断点,例如“ http://localhost:9000/ ”。