我在连接到sbt时遇到jdb中的断点时遇到问题。我编写了以下scala代码,并将其放在名为test.scala的文件中:
object test extends App {
def foo(x: Int): Int = {
print(".")
Thread.sleep(100)
x
}
println("started")
List.range(1, 100).foreach { a =>
foo(a)
}
println("done")
}
然后,在包含test.scala的目录中,我启动sbt并运行程序一次以确保一切正常。
sbt -jvm-debug 5005
> run
在另一个终端(同一个目录)中,我启动jdb:
jdb -attach 5005
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> stop in test.foo
Set breakpoint test.foo
> stop in test$.foo
Set breakpoint test$.foo
> stop at test.scala:3
Deferring breakpoint test.scala:3.
It will be set after the class is loaded.
然后在sbt中输入'run',程序完成而不停止。但是,jdb似乎已经足够了解能够设置断点的代码。当我再次运行,但使用'suspend'中断jdb中的所有线程时,我可以查看'threads'的输出:
jdb> threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x1627 Reference Handler cond. waiting
(java.lang.ref.Finalizer$FinalizerThread)0x1626 Finalizer cond. waiting
(java.lang.Thread)0x1625 Signal Dispatcher running
Group main:
(java.lang.Thread)0x1628 main cond. waiting
(java.lang.Thread)0x162a pool-4-thread-1 cond. waiting
(java.lang.Thread)0x162b pool-4-thread-2 cond. waiting
(java.lang.Thread)0x162c pool-4-thread-3 cond. waiting
(java.lang.Thread)0x162d pool-4-thread-4 cond. waiting
(java.lang.Thread)0x162e pool-4-thread-5 cond. waiting
(java.lang.Thread)0x162f pool-4-thread-6 cond. waiting
Group run-main-group-2:
(java.lang.Thread)0x1630 run-main-2 sleeping
选择运行测试的线程:
jdb> thread 0x1630
run-main-2[1] where
[1] java.lang.Thread.sleep (native method)
[2] test$.foo (test.scala:4)
...
run-main-2[1] step up
>
Step completed: "thread=run-main-2", test$.foo(), line=5 bci=14
run-main-2[1] class test
Class: test
extends: java.lang.Object
nested: test$
...
run-main-2[1] methods test
** methods list **
test main(java.lang.String[])
test delayedInit(scala.Function0)
test args()
test scala$App$_setter_$executionStart_$eq(long)
test executionStart()
test foo(int)
因此,jdb似乎知道我的代码中的类和方法名称以及行号,但不会在断点处停止。如果我在不存在的函数上设置断点,我得到:
> stop in test.whatever
Unable to set breakpoint test.whatever : No method whatever in test
表示它确实理解test.foo上的断点?我是否在test.foo或test $ .foo中使用stop in,on或at无关紧要。从谷歌搜索其他问题,似乎我的方法名称错误,但我不知道它会是什么。
我希望能够在现有的开发设置中添加一些简单的调试,而无需切换到Eclipse或IntelliJ。有什么我做错了或根本没有做过,或者没有简单的方法可以使这项工作?
版本信息: