$shibayu36->blog;

エンジニアをしています。プログラミングや読書のことなどについて書いています。

ターミナルのsbtで起動したプログラムをIntelliJのデバッガでデバッグする

最終的に結構簡単な設定で出来たのだけど、いろんな情報に右往左往させられてしまったので、自分用にメモをとっておく。

やりたいこと

Scalaで開発する時、基本的にターミナルでsbtを起動して、runとかtestとかを実行している。その時、挙動を動かしながら確認するために、ステップ実行を行いたい時がある。

ステップ実行しながらデバッグする時、IntelliJのデバッガが便利なのでそれを使いたい。

作戦

ターミナルで、sbtをJVMデバッグオプション付きで立ち上げて、そのプロセスにIntelliJのデバッガでアタッチするという方法を取る。

IntelliJの標準のScala開発環境で、「Enable debbuging for SBT shell」という設定もあるのだけど、これがなかなかうまく動かなかった。そこでこちらのやり方は諦めて、上記した方法を取ることにした。

やり方

sbtをJVMデバッグオプション付きで立ち上げる

まずsbtをJVMデバッグオプション付きで立ち上げる。最近のsbtではデフォルトでこのオプションが付いている。

$ sbt -jvm-debug 5005
Listening for transport dt_socket at address: 5005

ここで指定した5005がIntelliJのデバッガに設定すべきポート番号となる。このポート番号は自分で自由に変えても良い。

IntelliJのデバッガの設定を行う

まず「Select Run/Debug Configuration」から「Edit Configurations」に。

f:id:shiba_yu36:20170825071259p:plain

プラスボタンからRemoteを選択。

f:id:shiba_yu36:20170825071358p:plain

先程立ち上げたsbtのポートが指定されているか確認し、OKを押す。

f:id:shiba_yu36:20170825071550p:plain

これで設定は終わり。

デバッグする

あとはブレークポイントを設定してデバッグするだけ。以下のようにブレークポイントを設定して、虫のボタンを押す。

f:id:shiba_yu36:20170825072139p:plain

その後、ターミナルのsbtでrun。

> runMain SbtDebugExample
[info] Running SbtDebugExample

すると、IntelliJの画面に移ってデバッグできる。以下のように変数の内容がソースコードに出力されたり、ステップ実行できたりとめちゃくちゃ便利。

f:id:shiba_yu36:20170825072346p:plain

まとめ

色んな情報があって、ここまで設定するのに右往左往してしまったので、ターミナルのsbtで起動したプログラムをIntelliJのデバッガでデバッグする方法を自分用にまとめておいた。たぶんこの流れがわかっていれば、JVM起動する系は大体デバッグできそう?