IntelliJ의 내장 디버거를 사용하여 sbt에서 관리하는 Scala 코드를 디버깅하는 가장 쉬운 방법은 무엇입니까? sbt의 Google 코드 사이트의 "RunningSbt" 문서 에는 프로젝트 또는 테스트의 기본 클래스를 실행하기위한 명령이 나열되어 있지만 디버깅 명령이없는 것 같습니다.
후속 질문 : sbt의 jetty-run 명령을 사용할 때 IntelliJ의 디버거를 Jetty에 연결하는 가장 쉬운 방법은 무엇입니까?
IntelliJ의 내장 디버거를 사용하여 sbt에서 관리하는 Scala 코드를 디버깅하는 가장 쉬운 방법은 무엇입니까? sbt의 Google 코드 사이트의 "RunningSbt" 문서 에는 프로젝트 또는 테스트의 기본 클래스를 실행하기위한 명령이 나열되어 있지만 디버깅 명령이없는 것 같습니다.
후속 질문 : sbt의 jetty-run 명령을 사용할 때 IntelliJ의 디버거를 Jetty에 연결하는 가장 쉬운 방법은 무엇입니까?
답변:
IntelliJ에서 일반적인 디버깅의 경우 sbt를 사용하여 코드를 컴파일하는지 여부에 관계없이 일반적인 방식으로 응용 프로그램 실행 / 디버그 구성을 사용할 수 있습니다.
Jetty에서 실행중인 애플리케이션에 연결하려면 원격 디버그 구성을 만들어야합니다. 이렇게하면 IntelliJ는 원격 JVM을 실행하기위한 명령 줄 인수 집합을 제공합니다.
-Xdebug -Xrunjdwp : transport = dt_socket, server = y, suspend = n, address = 5005
이러한 인수로 sbt를 시작한 다음 jetty-run
. 마지막으로 IntelliJ에서 원격 디버그 구성을 시작합니다. 이 스레드 가 유용 할 수 있습니다.
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
jetty-run
sbt 프롬프트에서 실행 합니다.
sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
?
sbt -jvm-debug 5005
.
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를 실행중인 프로세스에 연결 합니다 . 이 양식에서 상위 3 개 필드, 무서운 동안, 당신은 텍스트를 복사 단지에 대한 참고 아웃 (주문을 디버깅하는 것은 위에서 지정한 자세한 그들이의를 포기하고 대신에보다의 -jvm-debug
당신을 위해 이미 처리 소요) - 유일한 구성 변경할 수있는 Settings
섹션은 중간 아래에 있습니다.
-jvm-debug
매개 변수 를 받아들이도록 스크립트를 수정하는 방법을 알아 내고 풀 요청으로 제출하는 것이 좋습니다. 동일한 플랫폼에있는 모든 사람에게 혜택을 줄 수있는 좋은 기회입니다.
나는 이것에도 약간의 문제가 있었기 때문에 지나치게 자세하게 될 위험이 있으므로 여기에 내가 한 일이 있습니다.
설정
sbt jetty-run에 대한 실행 구성 만들기
원격 디버깅을위한 디버그 구성 만들기
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
(실제로 구성을 만들려면 확인을 클릭해야합니다).위의 vm 옵션을 실행하도록 sbt 플러그인 설정
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
VM 매개 변수 상자에 이미있는 항목 뒤에 줄 을 붙여 넣 습니다.디버깅
sbt -jvm-debug 5005 console
한 다음 intelllJ Idea에서 중단 점을 설정하고 디버그를 실행합니다.
sbt -jvm-debug 5005 console
는 나를 위해 일 하지 않았지만 작동했습니다 sbt -jvm-debug 5005
.
관련 문제를 찾을 때이 질문을 발견했기 때문에 여기에 또 다른 대답을 추가하고 있습니다. 중단 점을 사용하여 테스트 클래스 디버깅.
저는 ScalaTest를 사용하고 있으며 일반적으로 sbt의 '테스트 전용'명령을 사용하여 제품군을 실행합니다. 이제 대화 형 디버거를 사용하려면 다음을 수행 할 수 있습니다.
'ScalaTest'유형의 새 실행 / 디버그 구성을 만들고 기본 "테스트 클래스 :"이름을 입력 한 다음 "시작 전 : SBT 작업 '테스트 컴파일'실행"을 선택합니다. 이제 테스트 소스에 중단 점을 배치하고이 구성을 실행할 수 있습니다.
이 답변이나 제공된 링크 중 어느 것도 저에게 효과가 없었기 때문에 이것을 알아 내면 공유 할 것이라고 생각했습니다 ...
내가 시작할 때 가지지 못한 배경 이해를 포함하여 ...
이것은 대부분 여기에 설명 된 추가 설명을 기반으로 합니다.
내 환경 : Scala 2.10.2, SBT 0.13 및 IntelliJ 13.1
배경:
- 어떤 이유로 든 SBT를 사용하여 IntelliJ에서 Scala를 컴파일하는 것은 Maven 프로젝트와 같은 방식으로 통합되지 않으므로 디버깅이 정말 쉽습니다.
- SBT로 컴파일 할 때 별도의 프로세스에서 컴파일하므로 원격 디버깅이 필요하다는 것을 이해 한 바 있습니다.
디버깅이란?
- 디버깅은 코드 실행 흐름을 제어 할 수있는 JVM 또는 앱을 실행할 수있는 모드입니다.
- 사용하는 디버깅 도구는 "다음 코드 줄을 실행 한 다음 다시 일시 중지"또는 "계속 실행"또는 "여기에 메모리에 저장된 변수 값 가져 오기"를 알리는 명령을 디버깅 엔진에 실행할 수 있습니다.
원격 디버깅이란 무엇입니까?
- 원격 디버깅은 네트워크 연결 (소켓)을 통해 디버깅합니다.
- 이 네트워크 연결을 통해 원격 시스템에서 디버그 엔진에 명령을 실행할 수 있습니다.
- 이것은 원격 서버에서 실행되는 코드를 디버깅하려는 경우에 유용하지만
- 또한 SBT에서 실행되는 Scala 코드와 IntelliJ 환경과 별도로 Jetty 또는 Tomcat과 같은 웹 서버를 통해 실행되는 상황에 유용합니다.
위의 링크를 참조하면 다음 설명 / 수정이 유용합니다.
- 네트워크 소켓을 설정할 때 사용할 포트를 포함하여 "디버깅 활성화"JVM 설정으로 SBT를 시작하도록 IntelliJ를 설정합니다. (변경되지 않음) 명명 된 VM 매개 변수를 IntelliJ 설정에 추가합니다.
- 여기의 포트 번호가 1 단계의 JVM 설정과 일치하는지 확인하십시오.
- SBT를 시작할 때 SBT 콘솔 플러그인 (1 단계에서 구성한 것)에서 수행해야합니다. IntelliJ 외부에서 (명령 줄에서) SBT를 실행하는 경우 1 단계와 동일한 VM 매개 변수로 SBT를 시작해야합니다 (이 작업은 수행하지 않았으므로 지침 없음). 이 단계가 끝나면 SBT가 실행되고 (하지만 코드는 아직 실행되지 않음) JVM이 원격 디버깅을 위해 설정됩니다.
- 그러면 3 단계에서 시작한 JVM에 연결되는 IntelliJ 디버깅 도구가 시작됩니다.
- 마지막으로 SBT 콘솔에서 컴파일을 시작합니다. 연속 컴파일 명령을 포함한 모든 컴파일 명령으로이 작업을 수행 할 수 있습니다. 계속해서 재 컴파일하면 재 컴파일이 발생하지만 디버거에 의해 코드 실행이 일시 중지되는 동안에는 발생하지 않습니다.
Intellij를 사용하여 SBT를 통해 빌드 된 Spray-can / Akka / Scala 앱을 사용하여 Windows에서도 디버깅에 어려움을 겪고 있습니다. 다양한 제안을 종합하여 가장 간단한 접근 방식은 다음과 같습니다.
프로젝트 /plugsin.sbt 파일에 sbt.Revolver가 있는지 확인하십시오.
addSbtPlugin ( "io.spray"% "sbt-revolver"% "0.7.1")
build.sbt 파일에서 javaoptions를 설정하십시오.
javaOptions : = Seq ( "-Xdebug", "-Xrunjdwp : transport = dt_socket, server = y, suspend = y, address = 5005")
특히 suspend = y 옵션을 사용하십시오. Intellij에서 원격 디버거를 연결할 때까지 앱이 유지됩니다.
Run / Edit Configurations 메뉴를 통해 Intellij에서 디버거 구성을 설정합니다. + 버튼을 누르고 "원격"옵션을 선택합니다. 항목이 위의 javaoptions, 특히 포트 주소 5005와 일치하는지 확인하십시오. 구성에 'Spray'와 같은 이름을 지정하십시오.
SBT 콘솔에서 다시 시작 명령을 사용하십시오. 피드백 출력에 5005 포트 주소가 표시되어야합니다.
Intellij에서 중단 점을 설정하십시오.
Intellij에서 Run \ Debug 'Spray'를 선택합니다. 이것은 스프레이 캔 웹 서버에 연결되어야합니다. 디버그 창에서 많은 스레드를 볼 수 있어야합니다.
스프레이의 일부 Get 지시문은 시작할 때 실행되지만 웹 사이트를 호출 할 때 반복적으로 실행되지는 않습니다.
Scala 2.10 및 SBT 0.12를 사용하여 다음과 같이 작동합니다. http://tuliodomingos.blogspot.com.es/2014/01/scala-remote-debugging-in-sbts-jetty.html
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-debug
Bash 스크립트 실행기에서 볼 때
NB. 나는 %SBT_HOME%
당신이 환경에서 명시 적으로 생성하지 않는 한이 스크립트 외부에 실제로 존재 한다고 생각 하지 않지만 어쨌든 요점을 얻습니다 : D
파일-> 설정-> 기타 설정-> 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 인 경우 멈췄습니다.
나도 같은 문제가 생겼습니다. 어떻게 해결했는지 공유하고 싶습니다. 그건 그렇고 나는 Ubuntu 14.04와 IntelliJ 15를 사용하고 있습니다.
설정-> SBT-> VM 매개 변수 텍스트 상자의 행 아래에 붙여 넣기 :
-XX : MaxPermSize = 384M -Xdebug -Xrunjdwp : transport = dt_socket, server = y, suspend = n, address = 5005
IntelliJ에서 Termilal을 열고 다음을 실행합니다.
sbt -jvm-debug 5005
참고 : 터미널에 "Listening for transport dt_socket at address : 5005"줄이 표시되어야합니다.
구성 편집-> + 클릭-> '원격'선택
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.
목록 상자 에서 DebugMyModule 을 선택 Edit Configurations
하고 Debug를 클릭 합니다.
참고 : 디버그보기가 열리고 디버그 콘솔에 표시되어야합니다. "대상 VM에 연결됨, 주소 : '127.0.0.1:5005'
, 전송 : 'socket'"이 표시되어야합니다.
Testclass의 몇 가지 테스트 케이스에 중단 점을 넣으십시오.
" sbt -jvm-debug 5005
" 를 실행하는 터미널로 오셔서 아래와 같이 실행하십시오.
project <your-module-name>
it:testOnly package.TestSpec
예 : com.myproject.module.AddServiceTest [Spec]
테스트 케이스 중단 점에서 시작된 디버그를 볼 수 있습니다.
AttachMe IntelliJ 플러그인은 잠재적으로 포트 번호를 조작하지 않고도 디버거를 연결하는 더 빠른 방법입니다.
AttachMe는 터미널에서 (또는 다른 방법으로) 앱을 시작하더라도 IntelliJ 디버거를 자동으로 연결합니다 .
Attach to process
수동으로 작업 을 트리거 할 필요가 없습니다 .
블로그 게시물 과 추가 정보 에는 설정 지침이 있지만 내 컴퓨터에서 작동하도록하려면 약간 변경해야했습니다.
installer.sh
공식 저장소에서 스크립트 다운로드
curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
chmod u+x installer.sh
./installer.sh
/.config/attachme/agent.jar
만들~/.attachme
파일을 합니다.~/.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"
해당 Attachme 플러그인을 설치하고 다시 시작합니다. IntelliJ | Preferences | Plugins
Attachme
실행 구성 만들기 :Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK
이러한 일회성 헛소리가 끝나면 자동으로 디버거를 연결할 수 있습니다.
Attachme
실행 구성 시작source ~/.attachme
sbt "runMain example.Hello"
위의 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 / ").