simple-build-tool(sbt)とIntelliJを使用したScalaコードのデバッグ


120

IntelliJの組み込みデバッガーを使用してsbtによって管理されるScalaコードをデバッグする最も簡単な方法は何ですか?sbtのgoogleコードサイトの "RunningSbt"のドキュメントには、プロジェクトまたはテストのメインクラスを実行するためのコマンドがリストされていますが、デバッグ用のコマンドがないようです。

追加質問:sbtのjetty-runコマンドを使用するときにIntelliJのデバッガーをJettyに接続する最も簡単な方法は何ですか?


6
今後は質問を混ぜないでください
hennr

回答:


47

IntelliJでの通常のデバッグでは、sbtを使用してコードをコンパイルしているかどうかに関係なく、アプリケーションの実行/デバッグ構成を通常の方法で使用できます。

Jettyで実行されているアプリケーションに接続するには、リモートデバッグ構成を作成する必要があります。これを行うと、IntelliJは、リモートJVMを実行するための一連のコマンドライン引数を提供します。

-Xdebug -Xrunjdwp:transport = dt_socket、server = y、suspend = n、address = 5005

これらの引数を指定してsbtを起動し、次に実行しjetty-runます。最後に、IntelliJでリモートデバッグ構成を起動します。このスレッドは役に立つかもしれません。


1
私のために通常の方法では、それはうまく動作しません:stackoverflow.com/questions/16337745/...は
SES

これはどこに入力しますか?-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622

@ Jwan622これらの引数を使用してsbtを起動します(たとえば、コマンドラインから、それらをコマンドライン引数として指定します)。次にjetty-run、sbtプロンプトで実行します。
アーロンノヴストラップ

走るだけsbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622

3
動作するはずのほとんどのユーザーにとって、それはあなたのシステムでsbtがどのように設定されているかによります。他の答えで述べたように、あなただけを実行することができる場合がありますsbt -jvm-debug 5005
アーロンノヴストラップ

189

Mac、Linux、Windows-jvm-debugの公式SBTパッケージには非常に便利なフラグがあります。フラグを使用して、デバッグポートを指定できます。

sbt -jvm-debug 5005

カバーの下で、これは典型的な詳細なデバッグの呪文でSBTのJVMを開始します:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

これで、たとえばsbt runコマンドを使用して、コードを通常どおり実行できます。

実行中のコードに接続するようにIntelliJを構成しています...

次に、リモートデバッグ構成を使用してIntelliJを実行中のプロセスに接続します。このフォームでは、上の3つのフィールドは、怖いながら、テキストをコピーするだけのためであることに注意してくださいアウト(呪文をデバッグすることは上記の指定された冗長な彼らは、与えているというに比べて、で-jvm-debug、すでにあなたのための世話をする) -のみの構成変更できるのは、Settings途中のセクションです。

IntelliJのリモートデバッグ構成


1
これはWindowsでは機能しません-この(お粗末な)プラットフォームで同様に行う方法についてのアイデア
javadba 2014年

これは、Windowsで使用されていると思われるランチャースクリプトです:github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt。スクリプトを変更して-jvm-debugパラメーターを受け入れる方法を理解し、それをプルリクエストとして送信することをお勧めします。同じプラットフォーム上にいるすべての人に利益をもたらす可能性は十分にあります。
Roberto Tyley 14年

調べた。Windows起動スクリプトはLinuxに対してWAYプリミティブです。今はできません。
javadba 14年


3
IntelliJのどこに「sbt -jvm 5005」を挿入するかを知っておくと役立ちます
eddy147 '13 / 11/16

39

私もこれでいくつかの問題を抱えていたので、過度に詳細に説明される危険を冒して、次のことを行いました。

セットアップ

  1. sbt jetty-runの実行構成を作成する

    • 実行>構成の編集に移動します
    • [+]アイコンをクリックし、Scala Compilation Serverを選択します
    • 任意の名前を入力し、[SBTアクションを実行]チェックボックスをクリックして、[...]からSBTアクションjetty-runを選択します
  2. リモートデバッグ用のデバッグ構成を作成する

    • 実行>構成の編集に移動します
    • [+]アイコンをクリックして、[リモート]を選択します
    • 任意の名前を入力し、行をコピーします-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(実際に構成を作成するには、[OK]をクリックしてください)。
  3. 上記のvmオプションを実行するようにsbtプラグインを設定する

    • [ファイル]> [設定]> [SBT]に移動します
    • -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005VMパラメーターボックスの行を、既にある行の後に貼り付けます。

デバッグ

  1. 必要に応じてブレークポイントを設定します
  2. 上で作成したsbt jetty-run構成を選択して[実行]> [実行]を選択するか、緑の矢印をクリックして、突堤Webサーバーを起動します。
  3. 上記で作成したリモートデバッグ構成を選択し、[実行]> [デバッグ]を選択するか、バグアイコンをクリックして、リモートデバッガーを起動します。

16
設定メニューにScala Compilation Serverはありません。だから私は何か特別なものが必要ですか?
Arne

step1は必要ないようです、私がすることはsbtコマンドを実行しsbt -jvm-debug 5005 console、次にintelllJ Ideaにブレークポイントを設定し、デバッグを実行することです。
Pengfei.X 2016年

@ Pengfei.X、sbt -jvm-debug 5005 console私のために動作しませんでしたが、動作しましsbt -jvm-debug 5005た。
Lukasz Czerwinski、2018年

8

これはいつも私にとってはうまくいき、セットアップする必要があるのはIntelliJでのリモートデバッグだけです。IntelliJのターミナルからJVMパラメータを使用してSBTを起動します。

sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

その後、localhost:5005でリモートデバッグを開始できます。


7

ここで別の答えを追加します。これは、関連する問題を調べるときにこの質問を見つけたためです。ブレークポイントを使用したテストクラスのデバッグです。

私はScalaTestを使用しており、通常はsbtの 'test-only'コマンドを使用してスイートを実行しています。インタラクティブデバッガを使用する場合、次のことができます。

タイプ「ScalaTest」の新しい実行/デバッグ構成を作成し、メインの「テストクラス:」の名前を入力して、「起動前:Run SBT Action 'test-compile'」を選択します。これで、テストソースにブレークポイントを配置して、この構成を実行できます。


同じですが、うまく動作しません:stackoverflow.com/questions/16337745/...は
SES

テストクラスに複数のテストがある場合、1つのテストしか実行できないことを知っていますか。次の質問をご覧ください。stackoverflow.com
Manu Chadha

7

これらの回答や提供されたリンクのどれも私にとってはうまくいかなかったので、これを理解したら、私は共有すると思っていました...

私が始めたときに私が持っていなかった背景の理解を含めて...

これは主に、ここでの説明に基づいており、私にそれを実行した追加の説明があります。

私の環境:Scala 2.10.2、SBT 0.13、およびIntelliJ 13.1

バックグラウンド:

  • 何らかの理由で、SBTを使用してIntelliJでScalaをコンパイルすることは、Mavenプロジェクトのように統合されていません(これにより、デバッグが非常に簡単になります)。
  • SBTでコンパイルする場合、別のプロセスでコンパイルしているため、リモートでデバッグする必要があることが私の理解から明らかです。

デバッグとは?

  • デバッグは、JVMまたはアプリを実行できるモードであり、コード実行のフローを制御できます。
  • 使用するデバッグツールは、「次のコード行を実行してから一時停止する」、「実行を続行する」、または「メモリにここに格納されている変数の値を取得する」ように指示するコマンドをデバッグエンジンに発行できます。

リモートデバッグとは何ですか?

  • リモートデバッグは、ネットワーク接続(ソケット)を介したデバッグです。
  • このネットワーク接続により、リモートマシンからデバッグエンジンにコマンドを発行できます。
  • これは、リモートサーバーで実行されているコードをデバッグする場合に便利ですが、
  • また、SBTで実行され、IntelliJ環境とは別に、JettyやTomcatなどのWebサーバー経由で起動するScalaコードのような状況でも役立ちます。

上記のリンクを参照すると、次の説明/変更が役立ちます。

  1. ネットワークソケットのセットアップ時に使用するポートを含め、「デバッグを有効にする」JVM設定でSBTを起動するようにIntelliJをセットアップします。(変更なし)IntelliJ設定に名前付きVMパラメーターを追加します。
  2. ここのポート番号がステップ1のJVM設定と一致することを確認してください。
  3. SBTを起動するときは、SBTコンソールプラグイン(ステップ1で構成したもの)から実行する必要があります。IntelliJの外部(コマンドライン)でSBTを実行している場合は、ステップ1と同じVMパラメーターを使用してSBTを起動する必要があります(私はこれを実行しなかったため、指示はありません)。この手順の後、SBTが実行され(ただし、コードはまだ実行されていません)、JVMはリモートデバッグ用に設定されています。
  4. これにより、ステップ3で開始したJVMに接続するIntelliJデバッグツールが起動します。
  5. 最後に、SBTコンソールでコンパイルを開始します。これは、継続的なコンパイルコマンドを含む、任意のコンパイルコマンドで実行できます。継続的な再コンパイルの場合、再コンパイルは行われますが、コードの実行がデバッガーによって一時停止されている間は行われません。

4
リンクが壊れています。
Andrew Bucknell 2017年

4

Intellijを使用してSBT経由でビルドされたSpray-can / Akka / Scalaアプリを使用するWindowsでもデバッグに苦労しています。さまざまな提案をつなぎ合わせて、私にとって最も簡単なアプローチは:

  1. project / plugsin.sbtファイルにsbt.Revolverがあることを確認してください。

    addSbtPlugin( "io.spray"% "sbt-revolver"% "0.7.1")

  2. build.sbtファイルにjavaoptionsを設定します。

    javaOptions:= Seq( "-Xdebug"、 "-Xrunjdwp:transport = dt_socket、server = y、suspend = y、address = 5005")

特に、suspend = yオプションを使用してください。これは、Intellijからリモートデバッガーを接続するまでアプリを保持します

  1. Run / Edit ConfigurationsメニューからIntellijでデバッガー構成をセットアップします。+ボタンを押し、「リモート」オプションを選択します。エントリが上記のjavaoptions、特に5005のポートアドレスと一致していることを確認してください。設定に「Spray」のような名前を付けます。

  2. SBTコンソールからre-startコマンドを使用します。フィードバック出力に5005ポートアドレスが表示されます。

  3. Intellijでブレークポイントを設定します。

  4. Intellijから、Run \ Debug 'Spray'を選択します。これにより、スプレー缶のWebサーバーに接続されます。デバッグウィンドウに多くのスレッドが表示されるはずです。

  5. Sprayの一部のGetディレクティブは、起動時に実行されるように見えますが、Webサイトの呼び出し時に繰り返し実行されるわけではないことに注意してください。


この答えを祝福してください!魅力のように働いた。
user2770362


3

Windowsの人にとって価値があるものについて%SBT_HOME%\bin\sbt.batは、次のコード行を編集して見つけます。

:run

"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
if ERRORLEVEL 1 goto error
goto end

次に、これらを次のコードに置き換えます。

FOR %%a IN (%*) DO (
  if "%%a" == "-jvm-debug" (
    set JVM_DEBUG=true
    set /a JVM_DEBUG_PORT=5005 2>nul >nul
  ) else if "!JVM_DEBUG!" == "true" (
    set /a JVM_DEBUG_PORT=%%a 2>nul >nul
    if not "%%a" == "!JVM_DEBUG_PORT!" (
      set SBT_ARGS=!SBT_ARGS! %%a
    )
  ) else (
    set SBT_ARGS=!SBT_ARGS! %%a
  )
)

if defined JVM_DEBUG_PORT (
  set _JAVA_OPTS=!_JAVA_OPTS! -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=!JVM_DEBUG_PORT!
)

call :run %SBT_ARGS%

if ERRORLEVEL 1 goto error
goto end

:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
goto :eof

-jvm-debugBashスクリプトランチャーで見たときと同じ動作をするために私ができる最善のこと

NB。%SBT_HOME%あなたがあなたの環境で明示的に作成しない限り、私は実際にはこのスクリプトの外に存在するとは思わないが、とにかくあなたはポイントを得る:D


1

3

ファイル->設定->その他の設定-> SBT VMパラメーター-Xmx512M -XX:MaxPermSize = 256M -Xdebug -Xrunjdwp:transport = dt_socket、server = y、suspend = n、address = 5005

実行->構成の編集+を押してから、リモートを選択します適用を押します

コマンド「run」を実行すると、SBTコンソール(intelliJによって内部で開始)に移動します。「listening for transport dt_socket at address:5005」が表示されます。

次に、実行->デバッグを押します。以下のデバッグメニューがアクティブになります。デバッガとコンソールの2つのタブがあります。

F7を使用して次の行から次の行へ

私はサスペンドをnに選択しました。実行コマンドを実行したときにyで止まった


1
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

これを試して


0

同じ問題が発生しました。解決方法を共有したいと思います。ちなみに私はUbuntu 14.04とIntelliJ 15を使用しています。

  1. [設定]-> [SBT]-> [VMパラメータ]テキストボックスの行の下に貼り付け:

    -XX:MaxPermSize = 384M -Xdebug -Xrunjdwp:transport = dt_socket、server = y、suspend = n、address = 5005

  2. IntelliJでTermilalを開いて実行します。

    sbt -jvm-debug 5005

    注:ターミナルに次の行が表示されるはずです: "Listening for transport dt_socket at address:5005"

  3. 構成の編集->クリック+->「リモート」を選択

    I. Give some name example: DebugMyModule
    
    II. All needed configurations will be set automatically, But you just verify. In Command line arguments should look like this "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005".
    
    III. In 'Search Sources in Module's Classpath' text box specify your module in which module your test cases are there.
    
    IV. put 127.0.0.1 host instead of 'localhost'. 'localhost' not working for me.
  4. 選択DebugMyModuleでのEdit Configurationsリストボックスをクリックしてデバッグを

    注:デバッグビューが開き、デバッグコンソールに表示されます。「ターゲットVMに接続されました。アドレス:'127.0.0.1:5005'、トランスポート: 'ソケット'」が表示されます。

  5. Testclassのいくつかのテストケースにブレークポイントを設定します。

  6. sbt -jvm-debug 5005」を実行するターミナルに来て、以下のように実行します

    project <your-module-name>
    it:testOnly package.TestSpec

    例:com.myproject.module.AddServiceTest [Spec]

  7. テストケースのブレークポイントでデバッグの開始を確認できます。


Ubuntu 16.04およびIntelliJ 2017.3では機能しません。デバッガーはアタッチされますが、ブレークポイントは無視されます。
ジョナサンノイフェルド

testSuiteはブレークポイントで停止できませんが、ブレークポイントがmainメソッド内にある場合は停止できます。
shengshan zhang

0

AttachMe IntelliJプラグインは、ポート番号をいじる必要なしに、デバッガを接続するよりも高速な方法です。

AttachMeは、ターミナルから(または他の方法で)アプリを起動した場合でも、IntelliJデバッガーを自動的にアタッチします。Attach to process手動でアクションをトリガーする必要はありません。

ブログの投稿readmeにはセットアップ手順がありますが、自分のマシンで機能させるには、少し変更する必要がありました。

  1. installer.sh公式リポジトリからスクリプトをダウンロード

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. 実行権限を与える chmod u+x installer.sh
  3. で実行する ./installer.sh
  4. これにより、エージェントがインストールされ、ファイルが/.config/attachme/agent.jar作成され~/.attachmeます
  5. ~/.attachme含むように変更

    AM_JDWP_ARGS="transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    echo Using JDWP arguments ${AM_JDWP_ARGS}
    export JAVA_TOOL_OPTIONS="- javaagent:/Users/mario_galic/.config/attachme/agent.jar -agentlib:jdwp=${AM_JDWP_ARGS}"
    echo "AttachMe configured successfully"
  6. 対応するAttachmeプラグインをインストールして再起動します。 IntelliJ | Preferences | Plugins

  7. Attachme実行構成を作成します。Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

これらの1回限りの不正操作の後で、デバッガーを自動的に接続できます。

  1. Attachme実行構成を開始する
  2. source ~/.attachme
  3. 端末からアプリケーションを起動します。 sbt "runMain example.Hello"
  4. デバッガーは自動的にアタッチし、任意のブレークポイントで停止します

-1

上記のRoberto Tyleyの回答によると、Windowsでは、sbtのインストール後に次の環境変数も設定する必要があります。

SBT_HOME
C:\ Program Files(x86)\ sbt \
[またはsbtがインストールされている場所]

SBT_OPTS -Xdebug
-runjdwp:transport = dt_socket、server = y、suspend = n、address = 5005

[RTのIntelliJの例]

パスに追加:%SBT_HOME%\ bin;%SBT_OPTS%

次に、プロジェクトフォルダー「sbt run -jvm -debug 5005」内のコマンドラインで次を実行します。

これが適切に機能している場合、コマンドラインは最初に「listening for transport dt_socket at address:5005」という行を出力します。

IntelliJにブレークポイントを設定します。

ブラウザーでWebサイトを開き、デバッガーのブレークポイントをトリガーします(例: " http:// localhost:9000 / ")。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.