메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Eclipse를 이용한 Java 애플리케이션 원격 디버그

Eclipse IDE를 활용하여 Java 애플리케이션 디버깅 전파

Charles Lu , 소프트웨어 엔지니어, IBM
Charles Lu는 IBM China Software Development Lab의 소프트웨어 개발자로서, 현재 IBM Lotus Expeditor 개발 업무를 담당하고 있다. 그는 장치 프로그래밍, 인스턴트 메시징 및 음성 기술에 관심을 가지고 있다.

요약:  로컬 데스크탑에서만 Java™ 애플리케이션을 디버그할 필요가 없다. 원격 디버깅을 이루는 다양한 연결 유형을 이용해 자신의 디버깅 기술을 전파하는 방법을 알아봅시다. 이 기사에서는 원격 애플리케이션 디버깅 설정 방법을 보여주는 예제와 기능에 대해 설명한다.

기사 게재일:  2011 년 11 월 28 일
난이도: 중급 원문:  보기
페이지뷰:  1865 회
의견:  


개발 플랫폼을 호스트할 수 없는 저사양 머신용 프로그램 개발 또는 서비스를 종료할 수 없는 웹 서버와 같은 전용 머신에 설치된 프로그램 디버깅과 같이, 원격 디버깅은 애플리케이션 개발에 유용하게 쓰일 수 있다. 다른 예로는 모바일 장치와 같이 제한적인 메모리 또는 CPU 성능으로 작동하는 Java 애플리케이션이나 애플리케이션과 개발 환경을 분리하려는 개발자를 들 수 있다.

선수조건

시작-구성 유형

시작 구성은 프로그램을 시작하는 데 사용할 수 있는 속성 세트를 유지한다. 시작-구성 유형은 Eclipse 플랫폼에서 시작할 수 있는 프로그램의 고유한 유형이다.

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를 이용한 디버깅과 앞서 말한 소프트웨어를 찾을 위치에 대한 자세한 정보는 참고자료를 참조한다.

JPDA 소개

자주 사용하는 약어

  • JDI — Java Debug Interface
  • JDT — Java Development Tools
  • JDWP — Java Debug Wire Protocol
  • JPDA — Java Platform Debugger Architecture
  • JVM — Java Virtual Machine
  • JVMDI — JVM Debug Interface
  • JVMTI — JVM Tool Interface
  • VM — Virtual Machine

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의 원격 디버깅 기능

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의 디버그 옵션
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에서 중단점 설정
Eclipse에서 중단점 설정
3. 로컬에서 애플리케이션 디버그
애플리케이션 디버깅 전에 그림 1에서 설명한 디버그 옵션을 프로젝트에서 사용하는지 확인한다. 로컬에서 애플리케이션을 디버그할 필요는 없지만, 모든 디버그 정보를 사용할 수 있는지 확인할 수 있다. Java 프로젝트를 마우스 오른쪽 단추로 클릭하고 Debug AsJava Application을 차례로 선택한다(그림 3 참조). 중단점에서 애플리케이션 실행이 중지되는 경우 디버깅 정보가 올바로 표시된다. 디버그 스택, 변수 또는 중단점 관리 등의 표시와 같은 디버깅 기능을 계속 사용할 수 있다.

그림 3. 로컬에서 애플리케이션 디버그
로컬에서 애플리케이션 디버그
4. Java 프로젝트 내보내기
우리는 이 애플리케이션을 디버그 대상으로 사용할 것이다. Java 프로젝트를 마우스 오른쪽 단추로 클릭하고, ExportJava를 차례로 선택한 다음, JAR file 또는 Runnable JAR file을 선택하여 프로젝트를 내보낸다. JAR 파일은 원하는 위치에 생성될 것이다. Java 소스가 대상 애플리케이션과 일치하지 않는 경우 디버그 기능이 올바로 작동하지 않을 것이라는 점을 인식하자.
5. Java 애플리케이션 수동 실행
애플리케이션을 수동으로 시작하기 위한 콘솔을 열어 Java 런타임 환경이 올바로 구성되어 있는지 확인한다.

목록 5. Java 애플리케이션을 호출하기 위한 샘플

java -jar test.jar

6. 애플리케이션 원격 디버그
원격 컴퓨터 또는 같은 머신 상의 알맞은 위치에 JAR 파일을 복사하고 디버그 서버를 호출한 다음, 클라이언트를 이 서버에 연결한다. 간단한 Java 애플리케이션이 디버그 서버 또는 클라이언트로 작동할 수 있다. 구성에 따라, Eclipse에서 Socket Attach 또는 Socket Listen 연결 유형을 선택할 수 있다. 다음 두 섹션에서는 애플리케이션을 서버 또는 클라이언트로 실행하는 방법을 알아보자.

대상 VM이 디버그 서버로 작동

다음은 원격 측에서 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 단추
Eclipse의 Terminate 단추

대상 VM이 디버그 클라이언트로 작동

두 번째 예제에서는 디버그 클라이언트로 작동하는 간단한 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에 관해 궁금한 점이 있으면 가장 먼저 Eclipse Platform 뉴스그룹을 살펴보자. (이 링크를 선택하면 기본 Usenet 뉴스 리더 애플리케이션이 실행되면서 eclipse.platform이 열린다.)

  • Eclipse 뉴스그룹에는 Eclipse 사용 및 확장에 관심이 있는 사용자를 위한 리소스가 많이 있다.

  • developerWorks 블로그를 통해 developerWorks 커뮤니티에 참여할 수 있다.

필자소개

Charles Lu는 IBM China Software Development Lab의 소프트웨어 개발자로서, 현재 IBM Lotus Expeditor 개발 업무를 담당하고 있다. 그는 장치 프로그래밍, 인스턴트 메시징 및 음성 기술에 관심을 가지고 있다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=오픈 소스, 자바
ArticleID=776605
ArticleTitle=Eclipse를 이용한 Java 애플리케이션 원격 디버그
publish-date=11282011

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.