67691


下記を見るとはっきりとは理解できていませんが、制約はあるものの(?)JDBを使うことが可能なようです。

[Command Line Debugger? - Kotlin
Discussions](https://discuss.kotlinlang.org/t/command-line-debugger/8027)

> The java debugger is language agnostic. As long as the sourcecode has lines
> and the debug information is present in the class file the debugger can use
> it. There is however one issue in that Kotlin uses synthetic line numbers
> for inline code (from other files) as the jvm only allows a single source
> file for a class file.

[jdb の使い方メモ - Qiita](https://qiita.com/dhomma/items/cbcbab679071b60c229b) を見ると

> デバッガとともにプログラムを起動する  
>  `# jdb MyProg01`

とあります。私は Spring Bootを `./gradlew bootRun`
で起動しているのですが、どのようにすればこのJDBを使えるのでしょうか？（もしくはJDBに限らず、よいデバッガーがあれば知りたいです）


CC BY-SA 4.0
2020-06-15T09:09:47.323
67681
2020-06-25T07:27:02.050
9008
question
spring kotlin spring-boot debugging
IDEなしでKotlinで書いたSpring Bootをデバッグしたい


<https://docs.oracle.com/javase/jp/1.5.0/tooldocs/solaris/jdb.html>

> jdb のもう 1 つの使用方法は、すでに起動している Java VM に jdb を接続することです。jdb を使用してデバッグする VM
> は、次のオプションを使用して起動しなければなりません。  
>  Option: `-agentlib:jdwp=transport=dt_socket,server=y,suspend=n`  
>  目的: インプロセスデバッグ用ライブラリをロードし、接続の種類を指定する  
>  (中略)  
>  次のコマンドを使用して、jdb を VM に接続できます。  
>  `% jdb -attach 8000`  
>  この場合、jdb は新しい VM を起動する代わりに既存の VM に接続されるため、jdb コマンド行には「MyClass」は指定しません。

<https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/JavaExec.html>

> The process can be started in debug mode (see getDebug()) in an ad-hoc
> manner by supplying the `--debug-jvm` switch when invoking the build.
[code]

>     gradle someJavaExecTask --debug-jvm
>  
[/code]

(Spring Bootのリファレンスにも、古いバージョンのものであれば[載っている](https://docs.spring.io/spring-
boot/docs/1.1.x/reference/html/howto-build.html#howto-remote-debug-gradle-
run))

* * *

というわけで、

[code]

    gradle bootRun --debug-jvm
    
[/code]

で実行すると

[code]

    Listening for transport dt_socket at address: 5005
    
[/code]

というログが出ると思いますので、`5005`番に`jdb`で接続します。

[code]

    jdb -attach 5005
    
[/code]

* * *

コメント受けて追記:

> Spring Bootのロゴが表示されるまえに止まり、jdb側で classes を打ってみたところ自分のクラスが表示されませんでした。

(デフォルトでは)[`suspend=y`](https://gradle.github.io/kotlin-dsl-
docs/api/org.gradle.process/-java-fork-options/set-
debug.html)で起動するようなのでデバッガを接続して開始指示するまで停止しています。

<https://docs.oracle.com/cd/E19146-01/820-0875/gdabx/index.html>

> suspend=y に使用すると、JVM は中断モードで起動され、デバッグが接続するまで中断された状態に保たれます。これは、JVM
> の起動後すぐにデバッグを開始したい場合に便利です。

(補足:
ちゃんとしたリファレンスは[こちら](https://docs.oracle.com/javase/jp/6/technotes/guides/jpda/conninv.html)かと思います)

前出`JavaExec`のリファレンスにありますが、これは`debugOptions`設定で変更可能で、Kotlin
DSLでは次のように書くようです(詳しくないので、もしかするとより良い書き方があるかもしれませんが):

[code]

    tasks.withType<BootRun> {
        debugOptions {
            suspend.set(false)
        }
    }
    
[/code]

> Ctr-CでSpring Bootを止めるとその後立ち上がりに失敗するなど不安定なのですが、止め方はあるのでしょうか？

デバッガで実行を一時停止している状態でSpringBootを止めようとしてCtrl+Cを押しても、JVMプロセスは終了できていないと思います。

> 止め方は jdbを確実に exit で抜けたあとに、Ctr-C で Spring Bootを止める感じでしょうか。

それが良いと思いますが、デバッガがSpringBootの処理を中断させていなければ、SpringBootから終了させても大丈夫でしょう。

(jdbに限らない、デバッガの一般的な挙動/使い方かと思います)


CC BY-SA 4.0
2020-06-15T12:42:32.327
67691
2020-06-25T07:27:02.050
2020-06-25T07:27:02.050
2376
2808
67681
answer