IntellijIDEA + Scala로 테스트 원격 디버깅

찾은 느낌, 뾰족한 기사는 sbt를 통과하지 않는 것 밖에 없고, 멀티 프로젝트라면 움직이지 않기 때문에 범용적으로 능숙하게 설정 (명령으로 시작한 sbt의 test에 대해서 원격 디버깅한다) 을 정리했습니다.

개요



Inttelij의 원격 디버거는 간단한 구성이라면 바삭하게 움직이지만,
멀티프로젝트를 사용하거나 테스트 프레임워크가 섞여 있거나 등이 있다고 예상대로 움직이는데 한 번 걸립니다.

run은 문제 없다.



수중에서 동작 확인을 할 때 run하여 상태를 보고 싶을 때는 다음과 같은 명령으로 실행하고 있습니다.
sbt 'project $pjName' -jvm-debug $port -Dconfig.file=$file run

test의 경우


sbt (test|testOnly) 때는 -jvm-debug만으로는 잘 움직이지 않고, 매회 이하의 설정을 test 태스크의 javaOption에 지정해 debug 하거나
javaOptions in Test ++= Seq("-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9999")

IntellijIDEA상에서 테스트에 대해 하나하나 debug conf를 만들어, -Dconfig~등의 테스트에 필요한 설정을 주거나 하고 있었습니다.

이것이 귀찮아서 Intellij와는 다른 teminal에서 시작한 sbt shell에서 실행 한 테스트를 디버깅 할 수있게했습니다.

이것이라면 testOption 등으로 지정한 디폴트 옵션도 읽어들여, 범용적으로 사용할 수 있어 행복

jdwp



Java TM Debug Wire Protocol (JDWP) 의 약어로, debugger 와, JVM 와의 사이의 통신에 사용하는 프로토콜입니다. 자세한 것은↓
htps : // / cs. 오라 cぇ. 이 m/쟈ゔぁ세/jp/6/테 ch에서 s/구이로 s/jp다/jdwps ぺc. HTML

이하 2개의 구성을 취할 수 있습니다.
  • JVM(sbt) = Server, Debugger(Intellij) = Client
  • JVM(sbt) = Client, Debugger(Inttelij) = Server

  • 어느 쪽이든 괜찮습니다만, JVM이 서버의 패턴이라면 Debugger 기동 잊어 suspend shift가 일어날 수 있으므로 Debugger측을 서버로 한 순서를 적습니다. (쉽게 바꿀 수 있으므로 취향에 부디)

    debug 작업 추가



    ↓의 Config 만드는 방법을 참고로 우리의 sbt에 remote debugger용 옵션을 짜넣은 Config를 추가했습니다.
    htps //w w. s 또는 sbt. rg / 0.13 / cs / s sing g. html # 아치 오나 l + 테 st + 곤푸 쿠라 치온 s + 우우 th + 멋쟁이 d + 그래 r s

    최소한이라면 ↓ 같은 느낌
      lazy val debugTest = config("debug") extend Test
    
      lazy val root = (project in file("./"))
       .configs(debugTest)
       .settings(      
         fork in DebugTest := true,
         javaOptions in DebugTest ++= Seq("-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=41230"
       )
       .settings(inConfig(DebugTest)(Defaults.testTasks))
    

    ※javaOption in Test에서도 좋지 않다고 생각할지도 모릅니다만, CI때에 debugger가 없으면
    JVM이 Client 인 경우 = 이끼 or JVM이 Server 인 경우 = debugger 연결을 기다린 채 멈추기 때문에 별도의 Config를 준비해야했습니다.

    도입 절차


  • 오른쪽 상단의 디버그 메뉴에서 Edit Configurations
  • 왼쪽 상단의 + ->remote를 클릭
  • Name->좋아하는 이름, Debugger Mode->Listen, Port->41230으로 설정하고 OK
  • 오른쪽 상단의 디버그 메뉴에서 만든 설정을 선택하고 🐞 아이콘을 클릭합니다.
  • 녹색으로 점멸하고 있는 상태에서, breakpoint를 붙여 터미널을 시작해, 좋아하게 debug:test 된다 debug:testOnly *Hogehoge 한다.
    * 한 번 실행 (debug : test 등)이 끝나면 디버거가 중지되므로 다시 실행하려면 4,5 단계를 반복하십시오.

    덤: JVM을 서버로 하고 싶을 때의 주의점



    Intellij의 debugger는 접속의 타이밍이 시비어인지, debugger가 접속할 때까지 대기한다 suspend=y 를 지정하지 않으면 연결되지 않았으므로 주의
  • 좋은 웹페이지 즐겨찾기