개발 플랫폼을 호스트할 수 없는 저사양 머신용 프로그램 개발 또는 서비스를 종료할 수 없는 웹 서버와 같은 전용 머신에 설치된 프로그램 디버깅과 같이, 원격 디버깅은 애플리케이션 개발에 유용하게 쓰일 수 있다. 다른 예로는 모바일 장치와 같이 제한적인 메모리 또는 CPU 성능으로 작동하는 Java 애플리케이션이나 애플리케이션과 개발 환경을 분리하려는 개발자를 들 수 있다.
Eclipse V3.4(Ganymede)를 아직 보유하고 있지 않다면 다운로드한다. Ganymede에서는 Remote Java Application 시작-구성 유형에 소켓 수신 대기 커넥터가 추가되었다. Eclipse의 새로운 소켓 수신 대기 커넥터를 통해 특정 소켓에 대한 연결을 수신 대기하는 Java 디버거를 시작할 수 있다. 그러면 디버거에 연결하기 위한 명령행 옵션으로 디버그 중인 프로그램을 시작할 수 있다. Ganymede가 릴리스되기 전에는 소켓 접속 커넥터만 제공되었으므로, 디버그 대상 프로그램이 디버거에 연결된 디버그 호스트여야 했다. 부족한 메모리와 CPU 성능 때문에 모바일 장치를 호스트로 사용하는 것은 비현실적이다.
원격 디버깅 기능을 사용하려면 IBM® J9 또는 Sun Microsystems의 Java SE Development Kit(JDK)과 같이 Java Virtual Machine(JVM) V5.0 이상을 사용해야 한다. 이 기사에서는 Eclipse의 디버깅 기능 각각에 대한 세부사항보다는 원격 디버깅에 초점을 맞춘다. Eclipse를 이용한 디버깅과 앞서 말한 소프트웨어를 찾을 위치에 대한 자세한 정보는 참고자료를 참조한다.
Sun Microsystems의 JPDA(Java Platform Debugger Architecture) 기술은 모든 상황에서 손쉽게 Java 애플리케이션을 디버그할 수 있게 해주는 다중 티어 아키텍처이다. JPDA는 2개의 인터페이스(각각 JVM Tool Interface 및 JDI), 프로토콜(Java Debug Wire Protocol), 이들을 함께 연결하는 2개의 소프트웨어 컴포넌트(백엔드 및 프론트 엔드)로 구성된다. JPDA는 어떤 환경에 있는 디버거라도 사용할 수 있도록 설계되었다. JPDA는 데스크탑 시스템에 사용될 뿐 아니라, 임베드된 시스템에서도 잘 작동한다.
JVMTI(JVM Tool Interface)에서는 VM이 디버깅을 대비해야 한다고 규정한다. (편집자 참고사항: Java V5부터는, JVMTI가 Java V1.4에서 사용되었던 JVMDI를 대체했다.) JDWP(Java Debug Wire Protocol)는 디버깅 정보의 형식 및 디버그 대상 프로세스와 Eclipse, Borland JBuilder 등의 JDI를 구현하는 디버거 프론트 엔드 간에 전송되는 요청을 설명한다. Sun의 JPDA 스펙에서는 디버그 대상 프로그램을 종종 디버기라고 부른다. JDI는 원격 디버깅에 사용되는 정보와 요청을 정의하기 위한 상위 레벨 인터페이스이다. 이 아키텍처는 다음과 같은 구조로 되어 있다.
목록 1. Java 플랫폼 디버거 아키텍처
Components Debugger Interfaces
/ |--------------|
/ | VM |
debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface
\ | back-end |
\ |--------------|
/ |
comm channel --( | <------------ JDWP - Java Debug Wire Protocol
\ |
/ |--------------|
/ | front-end |
debugger -----( |--------------| <---- JDI - Java Debug Interface
\ | UI |
\ |--------------|
|
따라서 JPDA를 기반으로 한 써드파티 도구와 VM이 함께 문제 없이 작동해야 한다. 이런 클라이언트-서버 아키텍처를 통해 플랫폼을 운영하는 로컬 워크스테이션에서 Java 프로그램을 디버그하거나 네트워크 상의 원격 컴퓨터에서 디버그할 수도 있다.
디버그 시나리오에 대해 설명하기 전에, JPDA 스펙에서 사용되는 커넥터와 전송이라는 두 가지 용어를 소개하겠다. 커넥터는 디버거 애플리케이션과 대상 VM 사이에 연결을 설정하는 데 사용되는 JDI 추상화이다. 전송은 애플리케이션이 데이터에 액세스하여 프론트 엔드와 백엔드 사이에서 전송하는 방식을 정의한다. 커넥터는 연결의 모드와 사용 가능한 전송 유형에 "맵핑"된다. Sun의 JPDA 참조 구현에서는 Microsoft® Windows®에서 소켓 전송과 공유 메모리 전송이라는 두 가지 전송 메커니즘이 제공된다. 사용 가능한 커넥터는 다음과 같다.
- 소켓 접속 커넥터
- 공유 메모리 접속 커넥터
- 소켓 수신 대기 커넥터
- 공유 메모리 수신 대기 커넥터
- 명령행 시작 커넥터
디버거 애플리케이션과 대상 VM 간에 연결을 설정할 때, 한쪽은 서버로 작동하면서 연결을 수신 대기한다. 나중에, 다른 쪽이 리스너에 연결하여 연결을 설정한다. 이런 연결을 통해 디버거 애플리케이션 또는 대상 VM이 서버 역할을 할 수 있다. 한 머신이나 다른 머신에서 프로세스 간의 통신이 작동 중일 수 있다.
Java 프로그램을 원격으로 디버깅할 때의 문제점이 디버거 프론트 엔드에는 없지만 원격 Java 백엔드에는 있다. 불행히도, Eclipse 도움말 시스템에는 이에 대한 정보가 그다지 많지 않다. 사실, JDI와 JVMTI는 각각 Eclipse와 Java 런타임 환경에 의해 구현된다. 우리가 관심을 갖는 유일한 것은 JDWP로서, 여기에는 JVMTI 및 JDI와 통신하기 위한 정보가 포함된다. JDWP에는 원격 Java 애플리케이션용 애플리케이션을 호출하기 위해 추가된 많은 인수가 있다. 다음은 이 기사에서 사용하는 몇 가지 인수다.
- -Xdebug
- 디버깅 기능을 사용한다.
- -Xrunjdwp:<하위 옵션>
- 대상 VM에 JDWP의 구현을 로드한다. 이때 전송 및 JDWP 프로토콜을 사용하여 별도의 디버거 애플리케이션과 통신한다. 특정 하위 옵션에 대해 설명하겠다.
Java V5부터는 -Xdebug와 -Xrunjdwp 대신 -agentlib:jdwp 옵션을 사용할 수 있다. 그러나 V5 이전의 VM에 연결해야 하는 경우에는 -Xdebug와 -Xrunjdwp만 선택할 수 있다. 다음은 -Xrunjdwp 하위 옵션에 대한 간략한 설명이다.
- transport
- 일반적으로 소켓 전송이 사용되지만, 사용 가능한 경우 Windows 플랫폼에서는 공유 메모리 전송을 사용할 수도 있다.
- server
- 값이 y인 경우 대상 애플리케이션은 디버거 애플리케이션의 연결을 수신 대기한다. 그렇지 않으면, 대상 애플리케이션이 지정된 주소에 있는 디버거 애플리케이션에 연결한다.
- address
- 연결을 위한 전송 주소이다. server 값이 n인 경우 이 주소에 있는 디버거 애플리케이션에 연결을 시도한다. 그렇지 않으면, 이 포트에서 연결을 수신 대기한다.
- suspend
- 값이 y인 경우 디버거 애플리케이션이 연결할 때까지 대상 VM이 일시중단된다.
각 디버그 설정에 대한 자세한 설명은 JPDA 문서를 참조한다(참고자료 참조).
목록 2는 디버그 모드에서 VM을 시작하고 포트 8765에서 소켓 연결을 수신 대기하는 방법의 예를 나타낸 것이다.
목록 2. 대상 VM이 디버그 서버로 작동
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765 |
목록 3은 포트 8000에서 호스트 127.0.0.1의 소켓을 사용하여 실행 중인 디버거 애플리케이션에 연결하는 방법을 나타낸 것이다.
목록 3. 대상 VM이 디버그 클라이언트로 작동
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000 |
Eclipse는 그래픽 Java 디버거 프론트 엔드이다. JDI는 org.eclipse.jdt.debug 번들로 구현된다. 이 기사에서는 JDI 구현에 대해 자세히 논하지 않는다. Eclipse JDT 및 Java JDI 기술에 관한 정보는 참고자료를 참조한다.
우리가 가장 먼저 알고 싶은 것은 사용할 Eclipse 커넥터가 어떤 것이냐 하는 점이다. Eclipse에서 제공하는 원격 연결 유형을 알아보려면 Eclipse 메뉴로
이동하여 Run > Debug Configurations...를 선택한 후 드롭다운 목록에서 커넥터를 선택하여 Remote Java Application에서
시작 구성을 추가하면 된다. Ganymede에서는 다음 두 커넥터가 제공된다.
- 소켓 접속
- 소켓 수신 대기
소켓 수신 대기 커넥터의 경우, Eclipse VM이 원격 Java 애플리케이션에서 연결할 호스트가 된다. 소켓 접속 커넥터의 경우, 대상 VM이 호스트가 된다. 두 커넥터 사이에 애플리케이션 디버깅의 차이는 없으므로, 사용자가 선택할 수 있다. 경험 법칙에 따르면, 필요한 전산 자원 때문에 더 빠르고 강력한 컴퓨터를 VM 디버그 호스트로 사용하는 것이 좋다.
Java 애플리케이션을 디버그하기 전에 원격 애플리케이션에 대해 디버그 옵션이 모두 사용되는지 확인할 필요가 있다. 그 정보를 알 수 없는 경우 "Debug information is not available(디버그 정보를 제공할 수 없음)" 또는 "Unable to install breakpoint due to missing line number(행 번호가 없어 중단점을 설치할 수 없음)"와 같은 오류 메시지가 표시된다. Window > Preferences > Java > Compiler에서 설정한 것을 변경하여 Eclipse 메뉴에서 설정을 수정할 수 있다.
그림 1. Eclipse의 디버그 옵션
애플리케이션 원격 디버깅을 시작할 준비가 되었다. 단계별로 진행해보자.
- 1. 간단한 클래스로 Java 프로젝트 작성
- 디버깅 목적으로 간단한 클래스를 작성한다. 목록 4에서 샘플 코드를 보여준다.
목록 4. 디버깅 샘플 코드
package com.ibm.developerWorks.debugtest;
public class test {
public static void main(String[] args) {
System.out.println("This is a test.");
}
}
|
- 2. 중단점 설정
- 코드에서 중단점을 설정한다. 이 예제에서는
System.out.println("This is a test.");행에 중단점을 설정한다.
그림 2. Eclipse에서 중단점 설정
- 3. 로컬에서 애플리케이션 디버그
- 애플리케이션 디버깅 전에 그림 1에서 설명한 디버그 옵션을 프로젝트에서 사용하는지 확인한다. 로컬에서 애플리케이션을 디버그할 필요는 없지만, 모든 디버그 정보를 사용할 수 있는지 확인할 수 있다. Java 프로젝트를 마우스 오른쪽 단추로 클릭하고 Debug As와 Java Application을 차례로 선택한다(그림 3 참조). 중단점에서 애플리케이션 실행이 중지되는 경우 디버깅 정보가 올바로 표시된다. 디버그 스택, 변수 또는 중단점 관리 등의 표시와 같은 디버깅 기능을 계속 사용할 수 있다.
그림 3. 로컬에서 애플리케이션 디버그
- 4. Java 프로젝트 내보내기
- 우리는 이 애플리케이션을 디버그 대상으로 사용할 것이다. Java 프로젝트를 마우스 오른쪽 단추로 클릭하고, Export와 Java를 차례로 선택한 다음, JAR file 또는 Runnable JAR file을 선택하여 프로젝트를 내보낸다. JAR 파일은 원하는 위치에 생성될 것이다. Java 소스가 대상 애플리케이션과 일치하지 않는 경우 디버그 기능이 올바로 작동하지 않을 것이라는 점을 인식하자.
- 5. Java 애플리케이션 수동 실행
- 애플리케이션을 수동으로 시작하기 위한 콘솔을 열어 Java 런타임 환경이 올바로 구성되어 있는지 확인한다.
목록 5. Java 애플리케이션을 호출하기 위한 샘플
java -jar test.jar |
- 6. 애플리케이션 원격 디버그
- 원격 컴퓨터 또는 같은 머신 상의 알맞은 위치에 JAR 파일을 복사하고 디버그 서버를 호출한 다음, 클라이언트를 이 서버에 연결한다. 간단한 Java 애플리케이션이 디버그 서버 또는 클라이언트로 작동할 수 있다. 구성에 따라, Eclipse에서 Socket Attach 또는 Socket Listen 연결 유형을 선택할 수 있다. 다음 두 섹션에서는 애플리케이션을 서버 또는 클라이언트로 실행하는 방법을 알아보자.
다음은 원격 측에서 Java 애플리케이션을 호출하고 디버그 서버로 작동하고 포트 8000에서 소켓 연결을 수신 대기하는 예제이다. 디버거가 연결할 때까지 대상 VM이 일시중단된다.
목록 6. Eclipse에서 소켓 접속 모드에 대한 VM 호출 샘플
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar
test.jar
|
원격 시작 구성을 사용하여 Eclipse를 시작하고 원격 애플리케이션의 대상 VM 주소를 지정한다. 이 작업을 수행하려면 Eclipse 메뉴에서 Run > Debug Configurations를 클릭하고 Remote Java Application을 두 번 클릭한다. 새로 작성된 시작 구성에서 대상 애플리케이션에 대한 IP와 포트를 지정한다. 동일한 머신에서 원격 애플리케이션을 실행하려면 간단히 호스트 IP 또는 로컬 호스트 또는 127.0.0.1을 지정한다.
그림 4. 소켓 접속 연결의 구성
Allow termination of remote VM 옵션을 선택하여 애플리케이션 디버깅 중에 연결하는 VM을 종료한다.
그림 5. Eclipse의 Terminate 단추
두 번째 예제에서는 디버그 클라이언트로 작동하는 간단한 Java 애플리케이션을 사용하며, 디버거 프론트 엔드가 디버그 서버로 작동한다. Eclipse에서는 소켓 수신 대기 모드 연결 유형을 사용하여 수신 대기한다. 특정 포트에서 수신 대기하려면 우선 디버그 프론트 엔드부터 시작해야 한다. 그림 6은 수신 대기를 설정하기 위한 샘플 구성을 나타낸 것이다.
그림 6. 소켓 수신 대기 연결의 구성
Eclipse Debug 단추를 클릭하면 상태 표시줄에 "waiting for vm to connect at port 8000..." 메시지가 표시된다. 이 메시지가 보이면 원격 애플리케이션을 시작한다. 목록 7은 Java 애플리케이션을 디버그 클라이언트로 호출하고 포트 8000에서 호스트 127.0.0.1의 소켓을 사용하여 실행 중인 디버거 애플리케이션에 이를 연결하는 방법을 나타낸 것이다.
목록 7. Eclipse에서 소켓 수신 대기 연결을 위한 VM 호출 샘플
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y
-jar test.jar
|
모든 것이 원활하게 진행되면 애플리케이션 디버깅을 지원하기 위한 디버그 퍼스펙티브가 표시되고 원격 Java 애플리케이션의 실행이 정상적으로 중지된다. 이는 로컬 디버깅에서 수행한 3단계와 유사하다(그림 3 참조). 이때 중단점과 값, 단계 실행 등과 같은 표준 디버깅 기능을 사용할 수 있다.
이 기사에서는 Eclipse에 내장된 원격 Java 애플리케이션 구성 유형을 사용하여 애플리케이션 디버깅을 원격으로 수행하는 방법을 설명했다. 그리고 원격 디버깅을 호출하도록 Java 애플리케이션을 설정하는 방법을 소개하고 Eclipse에서 제공하는 커넥터에 대한 정보를 제공했다. 마지막으로, 프로젝트에 이 기술을 적용하는 방법을 학습해보았다.
교육
-
"한 눈에 보는 Eclipse
Ganymede"에서는 자세한 정보를 제공하기 위한 참고자료 외에도 여러 가지 Ganymede 프로젝트에 대한 개요를 소개한다.
-
Eclipse 플랫폼을 이용한 디버깅에 대한 소개는
"Eclipse 플랫폼에서의 디버깅"을 참조하자.
-
Eclipse Debugging Resources를 통해 Eclipse 디버깅에 관한 지식을 넓히자.
-
Sun Microsystems의 Java Platform Debugger Architecture에 대해 자세히 알아보자.
-
Java Platform Debugger Architecture documentation을 읽고 JPDA에 대해 자세히 알아보자.
-
Java Debug Interface documentation을 읽고 JDI에 대해 자세히 알아보자.
-
JDT project에서는 Eclipse 플러그인을 포함한 Java 애플리케이션의 개발을 지원하는 Java IDE를 구현하는 도구
플러그인을 제공한다.
-
"Recommended Eclipse reading list"를 확인하자.
-
developerWorks에 있는 Eclipse 관련 컨텐츠를 모두 볼 수 있다.
-
Eclipse 입문자라면 developerWorks 기사인 "Get started with the Eclipse Platform"에서
Eclipse Platform의 기원과 아키텍처 및 플러그인을 사용하여 Eclipse를 확장하는 방법을 읽어보자.
-
IBM developerWorks의 Eclipse project resources를 활용하여 Eclipse 기술을 향상시키자.
-
developerWorks 팟캐스트에서 소프트웨어
개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
-
developerWorks의 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
-
무료로 제공되는 developerWorks On demand demos를 통해
IBM 및 오픈 소스 기술에 대해 배우고 제품 기능을 익히자.
-
IBM 오픈 소스 개발자에게 유익한 컨퍼런스, 기술 박람회, 웹 캐스트 및 기타 행사를 확인하고 참여하자.
-
developerWorks 오픈 소스 영역에서 오픈 소스 기술을 활용하여 개발 작업을 수행하고 이러한 기술을 IBM 제품과 함께 사용하는 데 도움이 되는
사용법 정보, 도구 및 프로젝트 업데이트를 확인할 수 있다.
제품 및 기술
-
Sun Microsystems에서 Java 2 Standard Edition V5 이상을
다운로드할 수 있다.
-
IBM alphaWorks에서 최신 Eclipse 기술 다운로드를 확인하자.
-
Eclipse Foundation에서 제공하는 Eclipse Platform 및 기타 프로젝트를 다운로드하자.
-
IBM 제품 평가판을 다운로드하고 DB2®, Lotus®, Rational®, Tivoli® 및
WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
-
DVD로 제공되거나 다운로드할 수 있는 IBM 시험판 소프트웨어를 사용하여
후속 오픈 소스 개발 프로젝트를 구현해 보자.
토론
-
Eclipse에 관해 궁금한 점이 있으면 가장 먼저 Eclipse
Platform 뉴스그룹을 살펴보자. (이 링크를 선택하면 기본 Usenet 뉴스 리더 애플리케이션이 실행되면서
eclipse.platform이 열린다.)
-
Eclipse 뉴스그룹에는 Eclipse 사용 및 확장에 관심이 있는 사용자를 위한 리소스가 많이 있다.
-
developerWorks 블로그를 통해 developerWorks 커뮤니티에 참여할 수 있다.