使用简单构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
部分:
我也遇到了一些麻烦,所以过分详细的风险,这是我做的:
build立
-
为sbt jetty-run创build一个运行configuration
- 转到运行>编辑configuration
- 单击[+]图标并selectScala编译服务器
- input您想要的名称,然后点击“运行SBT操作”checkbox,然后从[…]selectSBT Action jetty-
-
创build远程debugging的debuggingconfiguration
- 转到运行>编辑configuration
- 点击[+]图标并select远程
- input你想要的任何名字并复制
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
(确保点击OK实际创buildconfiguration)
-
设置sbt插件来运行上面的vm选项
- 转到文件>设置> SBT
- 在VM参数框中粘贴
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
,
debugging
- 根据需要设置断点
- 通过select上面创build的sbt jetty-runconfiguration启动jetty web服务器,然后selectRun> Run或单击绿色箭头
- 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服务器启动的情况也很有用。
参考上面的链接,下面的解释/修改是有用的:
- 安装IntelliJ以启动具有“启用debugging”JVM设置的SBT,包括设置networking套接字时使用的端口。 (不变)将指定的虚拟机参数添加到您的IntelliJ设置。
- 确保您的端口号与步骤1中的JVM设置相匹配。
- 当您启动SBT时,您需要从SBT控制台插件(这是您在步骤1中configuration的内容)执行此操作。 如果你在IntelliJ之外(在命令行)运行SBT,你将需要从步骤1启动具有相同VM参数的SBT(我没有这样做,所以没有说明)。 在这一步之后,SBT现在正在运行(但是你的代码还没有运行),JVM被设置为远程debugging。
- 这将启动IntelliJdebugging工具,它连接到您在步骤3中启动的JVM。
- 最后,在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议拼在一起,对我来说最简单的方法是:
-
确保你有你的项目/ 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远程debugging器
-
通过“运行/编辑configuration”菜单在Intellij中设置debugging器configuration。 按下+button,select“远程”选项。 确保条目匹配上面的java选项,特别是5005的端口地址。给configuration一个名字,比如“Spray”。
-
从您的SBT控制台使用重新启动命令。 您应该在反馈输出中看到5005端口地址。
-
在Intellij设置你的断点。
-
从Intellij中selectRun \ Debug'Spray'。 这应该连接到喷雾jarnetworking服务器。 您应该能够在debugging窗口中看到很multithreading。
-
请注意,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。
-
在设置 – > SBT – >粘贴在虚拟机参数下面的文本框中:
-XX:MaxPermSize = 384M -Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 5005
-
在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.
- 在“
Edit Configurations
列表框中select“ DebugMyModule ”,然后单击“ debugging” 。
注意:您应该看到Debug View已打开,并且在Debug Console中您应该能够看到“已连接到目标VM,地址: '127.0.0.1:5005'
: '127.0.0.1:5005'
,transport:'socket'”
-
在Testclass中的几个testing用例中放置断点。
-
来到你运行“
sbt -jvm-debug 5005
”的terminal,运行如下项目:testOnly package.TestSpec
例如:com.myproject.module.AddServiceTest [Spec]
- 您可以在您的testing案例断点中看到debugging开始。
我希望它会帮助你