Java는 기본적으로 JDWP (Java Debug Wire Protocol) 을 통해
외부에서 JVM에 디버거를 붙일 수 있는 기능을 제공합니다.
즉,
- 서버 JVM이 "디버거를 받아들일 준비"(server=y)를 하고,
- Eclipse가 "디버거 클라이언트"로서 접속하는 구조입니다.
아래 글은 서버에서 실행 중인 Java 프로그램을 Eclipse로 원격 디버깅하는 방법을 정리했습니다.
이 방법을 사용하면 실제 서버에서 돌아가는 프로그램의 상태를 Eclipse에서 로컬 디버깅하듯 브레이크포인트로 멈추고 변수 값을 확인할 수 있습니다.
⚙️ 1. 서버 측 설정 (배치파일 수정)
서버에서 실행되는 .bat 파일을 열어
아래와 같이 옵션 한 줄을 추가합니다.
📄 추가할 옵션
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5100
이때 저는 5100번 포트번호를 임의로 써주었습니다. (사용하지 않고 있는 포트번호)

🔍 주요 옵션 설명
| transport=dt_socket | 디버깅 연결을 TCP 소켓으로 받겠다는 뜻 |
| server=y | JVM이 디버거를 기다리는 서버 모드로 동작 |
| suspend=y/n | y: 디버거가 붙을 때까지 실행 멈춤 / n: 그냥 바로 실행 |
| address=0.0.0.0:5100 | 5100 포트로 모든 IP에서 접속 허용 |
| -classpath | 클래스 경로 지정 |
🖥️ 2. 서버 실행 및 확인
배치 파일을 더블클릭해 실행하면
콘솔에 다음과 같은 메시지가 떠야 합니다.
Listening for transport dt_socket at address: 5100
이게 보이면 디버그 포트가 정상적으로 열려서 5100번 포트에서 리스닝 중이라는 뜻입니다.
만약 포트 충돌 시에는 다른 포트를 사용해보세요.
🌐 3. 로컬 PC(Eclipse) 설정
Eclipse에서 아래 순서대로 설정합니다.
📋 설정 경로
⚙️ 설정 내용

| Project | 디버깅할 프로젝트를 선택 |
| Connection Type | Standard (Socket Attach) |
| Host | 서버 IP |
| Port | 5100 (서버에서 지정한 포트) |
이렇게 설정하여 apply 해주고 Debug를 해주면 됩니다.
🚀 4. 디버그 시작
저 같은 경우

위와 같은 Invalid thread access 라는 에러가 났습니다.
처음엔 포트나 방화벽 문제로 의심했지만, 포트도 잘 열려있었고 디버깅 직후 서버의 5100번 포트가 클라이언트와 연결은 되더라구요.
실제 원인은 이클립스가 디버그 실행 중 UI 스레드(SWT Display Thread) 를 잘못 접근했을 때 발생하는 예외.
⚙️ 원인 정리
이클립스는 워크스페이스마다 .metadata 폴더를 가지고 있고, 그 안에 다음 정보들이 저장됩니다:
<workspace>/
├── .metadata/
│ ├── .plugins/
│ │ ├── org.eclipse.debug.core/
│ │ ├── org.eclipse.e4.workbench/
│ │ ├── org.eclipse.jdt.core/
│ │ └── ...
│ └── workspace.xml
이 폴더에는
- 디버그 레이아웃,
- Perspective(화면 배치),
- 내부 플러그인 캐시,
- 이전 디버그 세션 정보
등이 모두 저장되는데
이게 꼬이거나, 오래된 플러그인 캐시가 남아 있으면 Eclipse가 UI 스레드에서 디버그 화면을 띄우는 순간 잘못된 스레드에서 SWT 호출이 일어나고 바로 예외가 터집니다.
→ 즉, “Invalid thread access”는 이 SWT 스레드 충돌 오류
아래는 제가 했던 방법들입니다.
(1) 새 Remote 설정 만들기
기존 설정이 깨진 상태일 수도 있으니 완전히 새로 만들어 보기:
- Run > Debug Configurations… > Remote Java Application > New Configuration
- Host / Port / Project 다시 지정 → Apply → 창 닫고 툴바에서 실행
>> 그래도 안됨
(2) 자바 jdk 버전 확인
서버와 버전이 안 맞다면 맞춰주세요
소스코드도 당연히 맞춰야하므로 맞는지 한번 더 확인해주었습니다.
>> 그래도 안됨
(3) Eclipse 캐시 정리
터미널이나 실행창에서:
→ 내부 플러그인 캐시 초기화
>> 그래도 안됨
(4) 워크스페이스 .metadata 초기화
- Eclipse 종료
- <workspace>\.metadata\.plugins\org.eclipse.e4.workbench\ 폴더 삭제
- Eclipse 재실행
→ UI 레이아웃/창 배치 정보가 초기화 후 새로 초기화된 레이아웃으로 열기
>> 그래도 안됨
(5) 새 워크스페이스
- File > Switch Workspace > Other… → 새 폴더 선택
- Import > Existing Projects into Workspace
- 다시 Remote 구성 새로 만들기
>> 됐음!
이렇게 새 워크스페이스로 프로젝트를 불러오면
.metadata 전체가 새로 생성되며,
깨진 캐시나 잘못된 플러그인 설정이 모두 초기화됩니다.
이 상태로 동일한 Remote Java Application 설정을 다시 만들면
에러 없이 정상적으로 디버깅이 시작됩니다.
🔍 왜 새 워크스페이스로 하면 되는가?
기존 워크스페이스의 .metadata 안에 저장된 이전 디버그 세션 정보나 UI 스레드 핸들이 꼬였기 때문
- Eclipse는 디버그 시 org.eclipse.debug.core 와 org.eclipse.e4.workbench 플러그인을 통해
내부적으로 UI 스레드에서 SWT 컴포넌트를 갱신합니다. - 그런데 이전 워크스페이스에서 플러그인 업데이트나 디버그 중단이 반복되면
해당 핸들이 비정상적으로 남고, 다음 디버그 시 잘못된 스레드에서 UI를 접근하게 됩니다. - 새 워크스페이스는 .metadata를 완전히 새로 만드므로
UI 핸들, 디버그 레이아웃, 캐시가 모두 초기화되어 충돌이 사라집니다.
즉,
새 워크스페이스를 만들면 된다ㅡ는 말은 깨진 Eclipse 내부 캐시를 재설정하는 것과 같습니다.
💡 결론
- 문제 요약:
Invalid thread access = Eclipse UI 스레드 충돌 (JDWP와 무관) - 원인:
기존 워크스페이스의 .metadata 내 캐시·플러그인 꼬임 - 해결:
새 워크스페이스로 프로젝트를 가져오면 .metadata가 초기화되어 정상 작동

“This kind of launch is configured to open the Debug perspective when it suspends.”
→ [Switch] 클릭 (디버깅 모드 전환)
이제 서버에서 돌아가는 프로그램이
Eclipse 디버그 모드로 연결되며,
브레이크포인트가 걸리면서 로컬에서 원격으로 디버깅을 할 수 있게 됩니다.
5. 자주 발생하는 문제 & 해결법
| Connection refused | 서버에서 포트 안 열림/이미 포트 사용 중 | 서버 콘솔에서 Listening... 확인 |
| Connection timed out | 방화벽 차단 | 서버 방화벽/포트 허용 |
| Invalid thread access | Eclipse UI 스레드 버그 | 워크스페이스 새로 만들 |
| UnsupportedClassVersionError | JDK 버전 불일치 | 서버/이클립스 모두 Java 8 클래스 파일로 맞추기 |
| bind failed: Permission denied | 원격 IP로 바인딩 | address=0.0.0.0:포트 로 변경 |
6. 참고 명령어
Test-NetConnection 192.168.0.10 -Port 5100
- TcpTestSucceeded : True → Server(192.168.0.10)가 5100번 포트를 열고 있음
netstat -ano | findstr ":5100"
- LISTENING → 서버 포트 열림, 아직 클라이언트 접속 없음
🏁 요약
- 서버 배치(.bat)파일에 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=포트번호 추가
- 서버 실행 후 콘솔에 Listening for transport... 확인
- 로컬 Eclipse에서 Remote Java Application 생성(Debug Configurations > Remote Java Application > New Configuration)
- Host/Port 설정 후 Apply 및 디버깅
- 브레이크포인트로 원격 코드 제어
'Back-end > java' 카테고리의 다른 글
| 이클립스 Project Explorer 뷰 설정 | 한줄 패키지 경로를 계층형 구조로 (0) | 2025.11.24 |
|---|