IntelliJ에서 디버깅을 누르면 무슨일이 일어날까?

JUHYUN·2024년 10월 15일
1
post-thumbnail

👀 디버깅과 관련된 것들을 눈으로 확인해보자!

IntelliJ에서 디버깅을 누르면 콘솔창에서 아래와 같은 문구를 볼 수 있습니다.

Connected to the target VM, address: '127.0.0.1:56147', transport: 'socket'

이 말을 해석해보면 127.0.0.1:56147'인 VM에 소켓으로 연결했다 라는 말이 될 것 같네요.

이를 좀 더 자세히 확인해보기 위해 위의 문구에서 나온 포트정보를 lsof 명령어로 확인해보겠습니다.

📒 lsof 명령어
list open files 의 약자로 시스템에서 열려있는 파일에 대한 정보를 출력해주는 명령어입니다. 리눅스에서 파일은 매우 광범위하기 때문에 단순한 파일 뿐만 아니라 네트워크 소켓, 파이프, 디렉토리, 장치 파일 등도 포함됩니다.

> lsof -i :56147
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
idea    12220 user123  382u  IPv6 0x2e6c54e476458215      0t0  TCP localhost:56147->localhost:56148 (ESTABLISHED)
java    30710 user123    5u  IPv4 0x2e6c54e474aaaa65      0t0  TCP localhost:56148->localhost:56147 (ESTABLISHED)

이를 확인해보면 56147 포트가 사용되는 소켓 연결이 2개 있고 양방향으로 통신할 수 있다 라는 말인 것 같네요! 그러면 다른 하나의 포트인 56148 포트는 무엇인지 JVM 프로세스를 보여주는 jps 명령어를 사용해 확인해보겠습니다.

> jps -l | grep 30710
30710 com.twoez.zupzup.ZupzupApplication

바로 프로젝트의 JVM 프로세스였습니다!

즉 이를 통해 에디터에서 사용하는 Java 디버깅 기능에 대해서 정리해보면

  1. 에디터에서 소켓(56147 포트)을 활용해 디버깅 세션을 만든다.
  2. 디버깅 대상이 되는 Java Application의 JVM에서 디버깅 세션 연결을 위한 소켓(56148 포트)을 만들어 에디터에서 만든 디버깅 세션과 연결한다.
  3. 양방향 통신이 구축되면 서로 정보를 주고 받으며 디버깅을 진행한다.

가 될 것 같네요!

양방향이 필요한 이유는.. 간단하게 생각해보면

  • 자바 어플리케이션은 실행정보(코드, 스택, 메모리에 올라온 데이터들 등)을 디버깅 세션에 보내주어야 할 것이고
  • 디버깅 세션은 코드 실행의 흐름을 제어할 수 있으니 관련된 정보를 자바 어플리케이션에 보내줘야 할 것 같습니다!

(물론 훨씬 많은 것들이 있을테지만요!)

🛜 Java Remote Debugging

IntelliJ 에서는 이를 활용해 다른 물리적 서버를 활용하는 자바 어플리케이션에 대해서도 로컬에서 디버깅할 수 있는 원격 디버깅 기능 또한 제공하는데요! 처음에는 이 기능이 굉장히 새롭고 신기해보였지만, 위의 과정들을 알고 나니 기존에 사용하는 디버깅 기능을 거의 똑같이 사용하는 것이란 생각이 들었습니다.

원격 디버깅을 위해서는 디버깅 대상이 되는 자바 어플리케이션에서 디버깅 세션과 연결할 수 있는 추가 포트를 열어 디버깅 세션의 연결 요청이 올 때 소켓으로 연결이 되면 되겠죠?

그러기 위해서 다음과 같은 옵션을 자바 실행 명령에 추가하면 됩니다.

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

이 옵션에서는 다음과 같은 설정을 할 수 있습니다.

  • agentlib:jdwp : jdwp 를 사용
  • transport=dt_socket : 소켓을 활용한 통신
  • server=y : client-server 관계에서 누가 서버 역할을 하는지에 대한 설정입니다. y로 설정했으니 자바 어플리케이션이 디버깅 세션에 attach 요청을 listen 하고 있을 것 입니다.
  • suspend=n : 디버깅 세션이 붙을 때까지 어플리케이션 실행을 지연시킬 것인지에 대한 설정입니다.
    만약 y 로 설정한다면 어플리케이션은 디버깅 요청이 올 때까지 실행되지 않고 기다릴 것입니다.
  • address=*:5005 : 서버가 가진 ip 주소 중 어떤 ip 주소에서의 접속을 허용할 것인지, 어떤 포트로 접근하게 할 것인지에 대한 설정을 할 수 있습니다.

JDWP (Java Debug Wire Protocol)
protocol used for communication between a debugger and the Java virtual machine (VM) which it debugs (hereafter called the target VM)
=> 디버거와 JVM 사이 통신을 위한 프로토콜입니다. 소켓을 활용하니 TCP Layer의 프로토콜이 될 것 같네요!


Ref

profile
행복과 같은 속도를 찾는 개발자

0개의 댓글