使用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
您现在可以正常运行代码,例如使用sbt run
命令.
现在,使用远程调试配置将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创建运行配置
转到"运行">"编辑配置"
单击[+]图标,然后选择Scala Compilation Server
输入您想要的任何名称,然后单击"运行SBT操作"复选框并从[...]中选择SBT Action码头运行
为远程调试创建调试配置
转到"运行">"编辑配置"
单击[+]图标,然后选择"远程"
输入您想要的任何名称并复制该行-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
(确保单击"确定"以实际创建配置)
设置sbt插件以运行上面的vm选项
转到文件>设置> SBT
将该行粘贴到-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
已存在的VM参数框中
调试
根据需要设置断点
通过选择上面创建的sbt jetty-run配置并选择Run> Run或单击绿色箭头来启动jetty Web服务器
通过选择上面创建的远程调试配置并选择Run> Debug或单击bug图标启动远程调试器
我在这里添加另一个答案,因为我在查找相关问题时发现了这个问题:使用断点调试测试类.
我正在使用ScalaTest,我通常使用sbt的'test-only'命令运行套件.现在,当我想使用交互式调试器时,我可以执行以下操作:
创建一个"ScalaTest"类型的新运行/调试配置,放置主"Test Class:"名称,然后选择"启动前:运行SBT操作'test-compile'".就是这样,您可以在测试源中放置断点,然后运行此配置.
这些答案或提供的链接都不适用于我,所以一旦我弄明白了,我想我会分享......
包括我开始时没有的背景知识......
这主要基于这里的说明,只是通过它的其他解释.
我的环境:Scala 2.10.2,SBT 0.13和IntelliJ 13.1
背景:
无论出于何种原因,使用SBT在IntelliJ中编译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控制台中开始编译.您可以使用任何编译命令执行此操作,包括连续编译命令.如果连续重新编译,则重新编译将发生,但不会在调试器暂停代码执行时发生.
这个每次都适合我,你唯一需要设置的是IntelliJ中的远程调试; 我从IntelliJ中的终端启动带有JVM参数的SBT:
sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
之后我可以在localhost:5005上启动远程调试