使用简单构build工具(sbt)和IntelliJ来debuggingScala代码

使用IntelliJ的内置debugging器来debuggingsbtpipe理的Scala代码最简单的方法是什么? 来自sbt的google代码网站的“RunningSbt”的文档列出了用于运行项目或testing的主类的命令,但似乎没有用于debugging的命令。

后续问题:使用sbt的jetty-run命令时,将IntelliJ的debugging器连接到Jetty最简单的方法是什么?

对于IntelliJ中的普通debugging,无论您是否使用sbt来编译代码,都可以以通常的方式使用Application运行/debuggingconfiguration。

要连接到在Jetty中运行的应用程序,您需要创build远程debuggingconfiguration。 当你这样做的时候,IntelliJ会给你一组运行远程JVM的命令行参数 – 类似

-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

用这些参数启动sbt,然后执行jetty-run 。 最后,在IntelliJ中启动远程debuggingconfiguration。 这个线程可能是有用的。

官方SBT软件包中有一个非常方便的-jvm-debug标志,用于Mac,Linux和Windows 。 您可以使用标志来指定debugging端口:

 sbt -jvm-debug 5005 

在封面下 ,这将启动带有典型冗长debugging咒语的SBT的JVM:

 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 

您现在可以正常运行您的代码,例如使用sbt run命令。

configurationIntelliJ连接到正在运行的代码…

现在使用远程debuggingconfiguration将IntelliJ连接到正在运行的进程。 请注意,这种forms的高三个字段,虽然可怕,只是为了复制文本,而不是(在上面给出了详细的debugging咒语,其中-jvm-debug已经为你照顾) – 您可以更改的唯一configuration是半调下的Settings部分:

IntelliJ中的远程调试配置

我也遇到了一些麻烦,所以过分详细的风险,这是我做的:

build立

  1. 为sbt jetty-run创build一个运行configuration

    • 转到运行>编辑configuration
    • 单击[+]图标并selectScala编译服务器
    • input您想要的名称,然后点击“运行SBT操作”checkbox,然后从[…]selectSBT Action jetty-
  2. 创build远程debugging的debuggingconfiguration

    • 转到运行>编辑configuration
    • 点击[+]图标并select远程
    • input你想要的任何名字并复制-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 (确保点击OK实际创buildconfiguration)
  3. 设置sbt插件来运行上面的vm选项

    • 转到文件>设置> SBT
    • 在VM参数框中粘贴-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

debugging

  1. 根据需要设置断点
  2. 通过select上面创build的sbt jetty-runconfiguration启动jetty web服务器,然后selectRun> Run或单击绿色箭头
  3. select上面创build的远程debuggingconfiguration,然后select“运行”>“debugging”或单击错误图标,启动远程debugging器

我在这里添加了另一个答案,因为在查找相关问题时发现了这个问题:使用断点debuggingtesting类。

我正在使用ScalaTest,而且我通常使用sbt的“test-only”命令来运行一个套件。 现在,当我想使用交互式debugging器时,我可以执行以下操作:

创build一个types为“ScalaTest”的新的运行/debuggingconfiguration,把主要的“Test Class:”名称,并select“在启动之前:运行SBT操作'test-compile'”。 就是这样,你现在可以在testing源中放置断点,然后运行这个configuration。

这些答案或提供的链接都没有为我工作,所以一旦我明白了这一点,我想我会分享…

包括我开始时没有的背景知识。

这主要基于这里的说明,附带的解释让我完成了这个任务。

我的环境:Scala 2.10.2,SBT 0.13和IntelliJ 13.1

背景:

  • 无论出于什么原因,使用SBT编译IntelliJ中的Scala并没有像Maven项目那样集成(真的很容易debugging)。
  • 从我的理解中可以看出,使用SBT进行编译时,需要在单独的进程中进行编译,因此需要进行远程debugging。

什么是debugging?

  • debugging是一种可以运行JVM或应用程序的模式,它允许您控制代码执行的stream程。
  • 您使用的debugging工具然后可以向debugging引擎发出命令,告诉它“执行下一行代码然后再次暂停”或“继续执行”或“获取存储在此处的variables的值”。

什么是远程debugging?

  • 远程debugging正在通过networking连接(套接字)进行debugging。
  • 此networking连接允许您从远程计算机向debugging引擎发出命令。
  • 当你想要debugging在远程服务器上运行的代码时,这是很有用的,但是
  • 对于在SBT下运行的Scala代码以及通过Jetty或Tomcat等独立于IntelliJ环境的Web服务器启动的情况也很有用。

参考上面的链接,下面的解释/修改是有用的:

  1. 安装IntelliJ以启动具有“启用debugging”JVM设置的SBT,包括设置networking套接字时使用的端口。 (不变)将指定的虚拟机参数添加到您的IntelliJ设置。
  2. 确保您的端口号与步骤1中的JVM设置相匹配。
  3. 当您启动SBT时,您需要从SBT控制台插件(这是您在步骤1中configuration的内容)执行此操作。 如果你在IntelliJ之外(在命令行)运行SBT,你将需要从步骤1启动具有相同VM参数的SBT(我没有这样做,所以没有说明)。 在这一步之后,SBT现在正在运行(但是你的代码还没有运行),JVM被设置为远程debugging。
  4. 这将启动IntelliJdebugging工具,它连接到您在步骤3中启动的JVM。
  5. 最后,在SBT控制台中开始编译。 您可以使用任何编译命令执行此操作,包括连续的编译命令。 如果连续重新编译,重新编译将会发生,但不会在代码执行被debugging器暂停时发生。

这个每次都适合我,而且你需要设置的唯一东西就是在IntelliJ中的远程debugging。 我从IntelliJ中的terminal启动带有JVM参数的SBT:

 sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 

之后,我可以开始远程debugginglocalhost:5005

使用Scala 2.10和SBT 0.12,我得到这样的工作: http : //tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html

我一直在使用Intellij在使用通过SBT构build的Spray-can / Akka / Scala应用程序的Windows上进行debugging。 把各种build议拼在一起,对我来说最简单的方法是:

  1. 确保你有你的项目/ plugsin.sbt文件中的sbt.Revolver例如

    addSbtPlugin(“io.spray”%“sbt-revolver”%“0.7.1”)

  2. 在你的build.sbt文件中设置javaoptions:

    javaOptions:= Seq(“ – Xdebug”,“-Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 5005”)

特别是使用suspend = y选项。 这将持有应用程序,直到您连接从Intellij远程debugging器

  1. 通过“运行/编辑configuration”菜单在Intellij中设置debugging器configuration。 按下+button,select“远程”选项。 确保条目匹配上面的java选项,特别是5005的端口地址。给configuration一个名字,比如“Spray”。

  2. 从您的SBT控制台使用重新启动命令。 您应该在反馈输出中看到5005端口地址。

  3. 在Intellij设置你的断点。

  4. 从Intellij中selectRun \ Debug'Spray'。 这应该连接到喷雾jarnetworking服务器。 您应该能够在debugging窗口中看到很multithreading。

  5. 请注意,Spray中的某些Get指令似乎在启动时被执行,但不会反复调用该网站。

File-> Settings-> Other Settings-> SBT VM parameters -Xmx512M -XX:MaxPermSize = 256M -Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

运行 – >编辑configuration按+,然后select远程按应用

现在在SBT控制台(由intelliJ开始)中,当你执行命令“run”时,你将看到“在地址:5005处侦听传输dt_socket”

现在按下运行 – >debugging。 你会看到下面的debugging菜单被激活。 它有两个选项卡Debugger和Console。

使用F7从下一行到下一行

我select暂停是n。 当我运行run命令的时候,它被卡住了

对于Windows版本来说,可以编辑%SBT_HOME%\bin\sbt.bat并find以下几行代码:

 :run "%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %* if ERRORLEVEL 1 goto error goto end 

然后用下面的代码replace它们:

 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 

在Bash脚本启动器中看到的最好的做法是为-jvm-debug获取相同的行为

NB。 我不认为%SBT_HOME%实际上存在于这个脚本之外,除非你在你的环境中明确地创build了,但无论如何你得到的点:D

我也有同样的问题,我喜欢分享我的解决scheme。 顺便说一句,我使用Ubuntu 14.04和IntelliJ 15。

  1. 在设置 – > SBT – >粘贴在虚拟机参数下面的文本框中:

    -XX:MaxPermSize = 384M -Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005

  2. 在IntelliJ中打开Termilal并运行:

    sbt -jvm-debug 5005

注意:你应该在terminal中看到这一行:“在地址:5005处收听传输dt_socket”3.编辑configuration – >点击+ – >select“远程”

  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. 
  1. 在“ Edit Configurations列表框中select“ DebugMyModule ”,然后单击“ debugging”

注意:您应该看到Debug View已打开,并且在Debug Console中您应该能够看到“已连接到目标VM,地址: '127.0.0.1:5005' : '127.0.0.1:5005' ,transport:'socket'”

  1. 在Testclass中的几个testing用例中放置断点。

  2. 来到你运行“ sbt -jvm-debug 5005 ”的terminal,运行如下

    项目:testOnly package.TestSpec

例如:com.myproject.module.AddServiceTest [Spec]

  1. 您可以在您的testing案例断点中看到debugging开始。

我希望它会帮助你