无法使用jdb和sbt设置断点

时间:2014-07-15 21:16:20

标签: scala debugging sbt jdb

我在连接到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。有什么我做错了或根本没有做过,或者没有简单的方法可以使这项工作?

版本信息:

  • Linux:Ubuntu 12.04.4 LTS(精确)
  • jdb:1.6(Java SE版本1.6.0_31)
  • sbt:0.13.5
  • scala:2.10.4
  • java版“1.6.0_31”
    • OpenJDK运行时环境(IcedTea6 1.13.3)(6b31-1.13.3-1ubuntu1~0.12.04.2)
    • OpenJDK 64位服务器VM(版本23.25-b01,混合模式)

0 个答案:

没有答案
相关问题