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 を起動し、プログラムを 1 回実行して、すべてが正常に機能していることを確認します。
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 はブレークポイントを設定できるほどコードについて十分に認識しているようです。もう一度実行して、「サスペンド」で jdb のすべてのスレッドを中断すると、「スレッド」の出力を確認できます。
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
- スカラ: 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、混合モード)