web-dev-qa-db-ja.com

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

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

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

116
Matthew

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

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

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

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

45
Aaron Novstrup

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

sbt -jvm-debug 5005

カバーの下で 、これは典型的な冗長デバッグの呪文でSBTのJVMを起動します。

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

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

実行中のコードに接続するためのIntelliJの構成...

次に、 Remote Debug configuration を使用して、IntelliJを実行中のプロセスに接続します。このフォームの上の3つのフィールドは、怖いですが、テキストoutをコピーするためだけのものです(上で指定した冗長なデバッグの指示を与えているので、これは-jvm-debugがすでに面倒をみてくれます)-変更できる唯一の構成は、Settingsセクションの中ほどです:

 Remote Debug configuration in IntelliJ 

174
Roberto Tyley

私もこれに問題を抱えていたので、過度に詳細になるリスクがあるため、ここで私がやったことは次のとおりです。

SETUP

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

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

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

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

デバッグ

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

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

私はScalaTestを使用しています。通常、sbtの「テスト専用」コマンドを使用してスイートを実行します。インタラクティブデバッガーを使用する場合、次の操作を実行できます。

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

7
0__

これは毎回動作します。セットアップする必要があるのは、IntelliJでのリモートデバッグだけです。 IntelliJのターミナルからJVMパラメーターでSBTを起動します。

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

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

6
Erik Madsen

これらの答えや提供されたリンクはどれも私にとってはうまくいきませんでした。

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

これは主に指示に基づいています here ちょうどそれを私に運んだ追加の説明と.

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

Scala 2.10とSBT 0.12を使用すると、次のように動作します。 http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts- jetty.html

3
Tulio Domingos

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

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

「run」コマンドを実行すると、SBTコンソール(intelliJによって内部で開始)で「アドレス:5005でトランスポートdt_socketをリッスンしている」と表示されます。

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

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

サスペンドをnに選択しました。 runコマンドを実行したときにyだったため、スタックしました

3
rayfish

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. [構成の実行/編集]メニューを使用して、Intellijでデバッガ構成をセットアップします。 [+]ボタンを押して、[リモート]オプションを選択します。エントリが上記のjavaoptions、特にポートアドレス5005に一致することを確認します。configに「Spray」などの名前を付けます。

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

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

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

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

3
Herc

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

Bashスクリプトランチャーで見たときに-jvm-debugで同じ動作を得るためにできること

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

2
Darren Bishop
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

これを試して

0
shengshan zhang

私も同じ問題を抱えています。解決方法を共有したいと思います。ところで、Ubuntu 14.04とIntelliJ 15を使用しています。

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

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

  2. IntelliJでTermilalを開き、次を実行します。

    sbt -jvm-debug 5005

    注:ターミナルに次の行が表示されます。「アドレス5005でトランスポートdt_socketをリッスンしている」

  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. Edit ConfigurationsリストボックスでDebugMyModuleを選択し、Debugをクリックします。

    注:デバッグビューが開き、デバッグコンソールに表示されるはずです「ターゲットVMに接続済み、アドレス:'127.0.0.1:5005'、トランスポート: 'socket'」が表示されるはずです

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

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

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

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

  7. テストケースブレークポイントでデバッグが開始されたことがわかります。

0
Sun