SBT (Simple-Build-Tool) 및 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-runsbt 프롬프트에서 실행 합니다.
Aaron Novstrup

그래서 그냥 달려 sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622

3
작동해야하는 대부분의 사용자에게는 sbt가 시스템에서 설정되는 방식에 따라 다릅니다. 다른 답변에서 언급했듯이 sbt -jvm-debug 5005.
Aaron Novstrup

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

이것은 Windows에서 사용되는 런처 스크립트입니다 : github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . -jvm-debug매개 변수 를 받아들이도록 스크립트를 수정하는 방법을 알아 내고 풀 요청으로 제출하는 것이 좋습니다. 동일한 플랫폼에있는 모든 사람에게 혜택을 줄 수있는 좋은 기회입니다.
Roberto Tyley 2014-06-27

그것을 조사했습니다. Windows 시작 스크립트는 WAY 기본 대 Linux입니다. 지금은 할 수 없습니다.
javadba

1
풀 요청은 합병 ... 볼 아래
대런 주교

3
IntelliJ에서 "sbt -jvm 5005"를 삽입 할 위치를 아는 것이 도움이 될 것입니다.
eddy147

39

나는 이것에도 약간의 문제가 있었기 때문에 지나치게 자세하게 될 위험이 있으므로 여기에 내가 한 일이 있습니다.

설정

  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(실제로 구성을 만들려면 확인을 클릭해야합니다).
  3. 위의 vm 옵션을 실행하도록 sbt 플러그인 설정

    • 파일> 설정> SBT로 이동합니다.
    • -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005VM 매개 변수 상자에 이미있는 항목 뒤에 줄 을 붙여 넣 습니다.

디버깅

  1. 원하는대로 중단 점 설정
  2. 위에서 만든 sbt jetty-run 구성을 선택하고 Run> Run을 선택하거나 녹색 화살표를 클릭하여 jetty 웹 서버를 시작합니다.
  3. 위에서 만든 원격 디버깅 구성을 선택하고 실행> 디버그를 선택하거나 버그 아이콘을 클릭하여 원격 디버거를 시작합니다.

16
구성 메뉴에 Scala Compilation Server가 없습니다. 그래서 나는 특별한 것이 필요합니까?
Arne

step1이 필요하지 않은 것 같습니다. sbt 명령을 실행 sbt -jvm-debug 5005 console한 다음 intelllJ Idea에서 중단 점을 설정하고 디버그를 실행합니다.
Pengfei.X

@ Pengfei.X sbt -jvm-debug 5005 console는 나를 위해 일 하지 않았지만 작동했습니다 sbt -jvm-debug 5005.
Lukasz Czerwinski

8

이것은 매번 나를 위해 작동하며 설정해야 할 유일한 것은 IntelliJ에서 원격 디버깅입니다. IntelliJ의 터미널에서 JVM 매개 변수로 SBT를 시작합니다.

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

그 후 localhost : 5005에서 원격 디버깅을 시작할 수 있습니다.


7

관련 문제를 찾을 때이 질문을 발견했기 때문에 여기에 또 다른 대답을 추가하고 있습니다. 중단 점을 사용하여 테스트 클래스 디버깅.

저는 ScalaTest를 사용하고 있으며 일반적으로 sbt의 '테스트 전용'명령을 사용하여 제품군을 실행합니다. 이제 대화 형 디버거를 사용하려면 다음을 수행 할 수 있습니다.

'ScalaTest'유형의 새 실행 / 디버그 구성을 만들고 기본 "테스트 클래스 :"이름을 입력 한 다음 "시작 전 : SBT 작업 '테스트 컴파일'실행"을 선택합니다. 이제 테스트 소스에 중단 점을 배치하고이 구성을 실행할 수 있습니다.


동일하지만 잘 작동하지 않습니다 : stackoverflow.com/questions/16337745/…
ses

테스트 클래스에 여러 테스트가있는 경우 하나의 테스트 만 실행할 수있는 방법을 알고 있습니까? 다음과 같은 질문 제발 봐 수 stackoverflow.com/questions/54977741/...
마누 Chadha 씨

7

이 답변이나 제공된 링크 중 어느 것도 저에게 효과가 없었기 때문에 이것을 알아 내면 공유 할 것이라고 생각했습니다 ...

내가 시작할 때 가지지 못한 배경 이해를 포함하여 ...

이것은 대부분 여기에 설명 된 추가 설명을 기반으로 합니다.

내 환경 : Scala 2.10.2, SBT 0.13 및 IntelliJ 13.1

배경:

  • 어떤 이유로 든 SBT를 사용하여 IntelliJ에서 Scala를 컴파일하는 것은 Maven 프로젝트와 같은 방식으로 통합되지 않으므로 디버깅이 정말 쉽습니다.
  • SBT로 컴파일 할 때 별도의 프로세스에서 컴파일하므로 원격 디버깅이 필요하다는 것을 이해 한 바 있습니다.

디버깅이란?

  • 디버깅은 코드 실행 흐름을 제어 할 수있는 JVM 또는 앱을 실행할 수있는 모드입니다.
  • 사용하는 디버깅 도구는 "다음 코드 줄을 실행 한 다음 다시 일시 중지"또는 "계속 실행"또는 "여기에 메모리에 저장된 변수 값 가져 오기"를 알리는 명령을 디버깅 엔진에 실행할 수 있습니다.

원격 디버깅이란 무엇입니까?

  • 원격 디버깅은 네트워크 연결 (소켓)을 통해 디버깅합니다.
  • 이 네트워크 연결을 통해 원격 시스템에서 디버그 엔진에 명령을 실행할 수 있습니다.
  • 이것은 원격 서버에서 실행되는 코드를 디버깅하려는 경우에 유용하지만
  • 또한 SBT에서 실행되는 Scala 코드와 IntelliJ 환경과 별도로 Jetty 또는 Tomcat과 같은 웹 서버를 통해 실행되는 상황에 유용합니다.

위의 링크를 참조하면 다음 설명 / 수정이 유용합니다.

  1. 네트워크 소켓을 설정할 때 사용할 포트를 포함하여 "디버깅 활성화"JVM 설정으로 SBT를 시작하도록 IntelliJ를 설정합니다. (변경되지 않음) 명명 된 VM 매개 변수를 IntelliJ 설정에 추가합니다.
  2. 여기의 포트 번호가 1 단계의 JVM 설정과 일치하는지 확인하십시오.
  3. SBT를 시작할 때 SBT 콘솔 플러그인 (1 단계에서 구성한 것)에서 수행해야합니다. IntelliJ 외부에서 (명령 줄에서) SBT를 실행하는 경우 1 단계와 동일한 VM 매개 변수로 SBT를 시작해야합니다 (이 작업은 수행하지 않았으므로 지침 없음). 이 단계가 끝나면 SBT가 실행되고 (하지만 코드는 아직 실행되지 않음) JVM이 원격 디버깅을 위해 설정됩니다.
  4. 그러면 3 단계에서 시작한 JVM에 연결되는 IntelliJ 디버깅 도구가 시작됩니다.
  5. 마지막으로 SBT 콘솔에서 컴파일을 시작합니다. 연속 컴파일 명령을 포함한 모든 컴파일 명령으로이 작업을 수행 할 수 있습니다. 계속해서 재 컴파일하면 재 컴파일이 발생하지만 디버거에 의해 코드 실행이 일시 중지되는 동안에는 발생하지 않습니다.

4
링크가 끊어졌습니다.
Andrew Bucknell

4

Intellij를 사용하여 SBT를 통해 빌드 된 Spray-can / Akka / Scala 앱을 사용하여 Windows에서도 디버깅에 어려움을 겪고 있습니다. 다양한 제안을 종합하여 가장 간단한 접근 방식은 다음과 같습니다.

  1. 프로젝트 /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 콘솔에서 다시 시작 명령을 사용하십시오. 피드백 출력에 5005 포트 주소가 표시되어야합니다.

  3. Intellij에서 중단 점을 설정하십시오.

  4. Intellij에서 Run \ Debug 'Spray'를 선택합니다. 이것은 스프레이 캔 웹 서버에 연결되어야합니다. 디버그 창에서 많은 스레드를 볼 수 있어야합니다.

  5. 스프레이의 일부 Get 지시문은 시작할 때 실행되지만 웹 사이트를 호출 할 때 반복적으로 실행되지는 않습니다.


이 답변에 대해 축복합니다! 매력처럼 작동했습니다.
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

실행-> 구성 편집 +를 누른 다음 원격 선택 적용을 누릅니다.

이제 SBT 콘솔 (intelliJ에 의해 시작됨)에서 'run'명령을 실행하면 "Listening for transport dt_socket at address : 5005"가 표시됩니다.

이제 Run-> Debug를 누르십시오. 아래의 디버그 메뉴가 활성화 된 것을 볼 수 있습니다. 두 개의 탭 디버거와 콘솔이 있습니다.

F7을 사용하여 다음 줄에서 다음 줄로 이동

나는 suspend를 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하고 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. 테스트 케이스 중단 점에서 시작된 디버그를 볼 수 있습니다.


Ubuntu 16.04 및 IntelliJ 2017.3에서는 작동하지 않으며 디버거는 연결되지만 중단 점은 무시됩니다.
Jonathan Neufeld는

testSuite는 중단 점에서 중지 할 수 없지만 중단 점이 main 메서드에 있으면 중지 할 수 있습니다.
shengshan zhang

0

AttachMe IntelliJ 플러그인은 잠재적으로 포트 번호를 조작하지 않고도 디버거를 연결하는 더 빠른 방법입니다.

AttachMe는 터미널에서 (또는 다른 방법으로) 앱을 시작하더라도 IntelliJ 디버거를 자동으로 연결합니다 . Attach to process수동으로 작업 을 트리거 할 필요가 없습니다 .

블로그 게시물추가 정보 에는 설정 지침이 있지만 내 컴퓨터에서 작동하도록하려면 약간 변경해야했습니다.

  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. 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에서 중단 점을 설정합니다.

브라우저에서 웹 사이트를 열어 디버거 중단 점을 트리거합니다 (예 : " http : // localhost : 9000 / ").

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.