jdb - Java 디버거

jdb 는, Java 언어 프로그램의 버그를 찾아내 수정하기 위해서 사용하는 툴입니다.

형식

jdb [ options ] [ class ] [ arguments ] 
options
다음에 나타내는 커멘드행 옵션
class
디버그를 개시하는 클래스의 이름
arguments
classmain() 메소드에 건네주는 인수

설명

Java 디버거 jdb 는, Java 클래스용의 간단한 커멘드행 디버거입니다. Java Platform Debugger Architecture 를 시각적으로 실행해, 로컬 또는 원격의 Java Virtual Machine 의 검사와 디버그를 실시할 수가 있습니다.

jdb 세션의 개시

jdb 세션을 개시하기에는 다양한 방법이 있습니다. 무엇보다 빈번하게 사용되는 것은, 디버그 하는 어플리케이션의 메인 클래스를 사용해,jdb 로부터 새로운 Java 가상 머신 (VM)을 기동하는 방법입니다. 커멘드행으로, java 대신에 jdb 커멘드를 입력합니다. 예를 들어, 어플리케이션의 메인 클래스가 MyClass 의 경우는, JDB 환경에서 디버그 할 경우에 다음의 커멘드를 사용합니다.
C:\> jdb MyClass 
이 방법으로 기동하면(자),jdb 는, 지정된 파라미터를 사용해 2 번째의 Java VM 를 호출합니다. 다음에, 지정된 클래스를 로드해, 클래스의 최초의 명령을 실행하기 전에 VM 를 정지시킵니다.

jdb 마시자 1 개의 사용 방법은, 벌써 기동하고 있는 Java VM 에 jdb 를 접속하는 것입니다. jdb 를 사용해 디버그 하는 VM 는, 다음의 옵션을 사용해 기동하지 않으면 안됩니다.

옵션 목적
-agentlib:jdwp=transport=dt_shmem, server=y, suspend=n 인 프로세스 디버그용 라이브러리를 로드해, 접속의 종류를 지정한다

예를 들어, 다음의 커멘드는, MyClass 어플리케이션을 실행해,jdb 가 나중에 그 어플리케이션에 접속할 수 있게 합니다.

C:\> java -agentlib:jdwp=transport=dt_shmem, address=jdbconn, server=y, suspend=n MyClass
다음의 커멘드를 사용해,jdb 를 VM 에 접속할 수 있습니다.
C:\> jdb -attach jdbconn 
이 경우,jdb 는 새로운 VM 를 기동하는 대신에 기존의 VM 에 접속되기 (위해)때문에,jdb 커멘드행에는 「MyClass」는 지정하지 않습니다.

디버거를 VM 에 접속하려면 그 밖에도 다양한 방법이 있어, 모두 jdb 로 지원되고 있습니다. 접속 옵션에 대해서는, Java Platform Debugger Architecture 의문서를 참조해 주세요. jdb 로 사용하기 위해서 J2SE 1.4. 2 이전의 VM 를 기동하는 방법에 대해서는,1.4. 2 documentation 의 문서를 참조해 주세요.

기본 jdb 커멘드

기본적인 jdb 커멘드의 일람을 나타냅니다. Java 디버거가 지원하는 커멘드는 이외에도 있어, 그것들은 jdbhelp 커멘드를 사용해 표시할 수 있습니다.
help 또는 ?
무엇보다 중요한 jdb 커멘드 help 는, 인식된 커멘드의 리스트에 간결한 설명을 붙여 표시합니다.
run
jdb 를 기동해 필요한 breakpoint를 설정한 뒤에, 이 커멘드를 사용해, 디버그 하는 어플리케이션의 실행을 개시할 수 있습니다. 이 커멘드는, 기존의 VM 에 접속하고 있는 경우와는 달라, 디버그 하는 어플리케이션이 jdb 로부터 기동했을 때에만 사용할 수 있습니다.
cont
breakpoint, 예외, 또는 스텝 실행의 나중에, 디버그 하는 어플리케이션의 실행을 계속합니다.
print
Java 객체 및 프리미티브(primitive)치를 표시합니다. 원시형의 변수 또는 필드의 경우에는, 실제의 값이 출력됩니다. 객체의 경우에는, 짧은 설명이 출력됩니다. 객체에 대해서는, 이후의 dump 커멘드의 설명을 참조해 주세요.

주:국소 변수를 표시하려면 , 그 변수를 포함한 클래스가 javac -g 옵션으로 컴파일되어 있지 않으면 안됩니다.

print 에서는, 메소드의 호출을 포함한 다수의 간단한 Java 식이 지원되고 있습니다. 다음에 예를 나타냅니다.

  • print MyClass.myStaticField
  • print myObj.myInstanceField
  • print i + j + k (i, j, 및 k 는 프리미티브(primitive)이고, 필드 또는 국소 변수의 언젠가)
  • print myObj.myMethod() (myMethod 가 null 이외를 돌려주는 경우)
  • print new java.lang.String("Hello"). length()
dump
프리미티브(primitive)치의 경우에는, 이 커멘드는 print 와 같습니다. 객체의 경우에는, 객체내에 정의되고 있는 각 필드의 현재의 값이 출력됩니다. static 필드와 instance 필드가 출력됩니다.

dump 커멘드에서는,print 커멘드와 같은 식이 지원됩니다.

threads
현재 실행중의 thread를 일람표 가리킵니다. thread 마다, 이름과 현재 상태, 및 다른 커멘드에 사용할 수 있는 인덱스가 출력됩니다. 다음에 예를 나타냅니다.
4.  (java.lang.Thread) 0x1 main      running
이 예에서는, thread 인덱스는 4 이며, thread는 java.lang.Thread 의 인스턴스입니다. thread의 이름은 「main」이며, 현재 실행중입니다.
thread
현재의 thread로 하는 thread를 선택합니다. 많은 jdb 커멘드는, 현재의 thread의 설정에 근거해 실행됩니다. thread는,threads 커멘드로 설명한 thread 인덱스와 함께 지정합니다.
where
인수를 지정하지 않고 where 를 실행하면(자), 현재의 thread의 스택이 덤프 됩니다. where all 커멘드는, 현재의 thread 그룹에 있는 thread의 스택을, 모두 덤프 합니다. where threadindex 은, 지정된 thread의 스택을 덤프 합니다.

현재의 thread가 (breakpoint나 suspend 커멘드에 의해) 중단하고 있는 경우는, 국소 변수와 필드는 print 커멘드와 dump 커멘드로 표시할 수 있습니다. up 커멘드와 down 커멘드로, 어느 스택 프레임을 경향으로 할까를 선택할 수가 있습니다.

breakpoint

breakpoint는, 행 번호 또는 메소드의 최초의 명령으로 jdb 로 설정할 수 있습니다. 다음에 예를 나타냅니다.
  • stop at MyClass:22 (MyClass 가 포함되는 원시 파일의 22 행 째의 최초의 명령에 breakpoint를 설정)
  • stop in java.lang.String.length (java.lang.String.length 메소드의 최초로 breakpoint를 설정)
  • stop in MyClass. <init> (<init> 는 MyClass 생성자 을 식별)
  • stop in MyClass. <clinit> (<clinit> 는 MyClass 의 정적 초기화 코드를 식별)

메소드가 overload 되고 있는 경우에는, 메소드의 인수의 형태도 지정해, breakpoint에 대해서 적절한 메소드가 선택되도록(듯이) 하지 않으면 안됩니다. 예를 들어, 「MyClass.myMethod(int, java.lang.String)」또는 「MyClass.myMethod()」라고 지정합니다.

clear 커멘드는,clear MyClass:45 와 같은 구문을 사용해 breakpoint를 삭제합니다. clear 를 사용하는지, 인수를 지정하지 않고 커멘드를 사용하면(자), 현재 설정 떠날 수 있어 모든 breakpoint가 표시됩니다. cont 커멘드는 실행을 계속합니다.

스텝 실행

step 커멘드는, 현재의 스택 프레임 또는 불려 간 메소드내에서, 다음의 행을 실행합니다. next 커멘드는, 현재의 스택 프레임의 다음의 행을 실행합니다.

예외

throw 하고 있는 thread의 호출 스택상의 어디에도 catch 문이 없는 경우에 예외가 발생하면(자), VM 는 일반적으로, 예외 트레이스를 출력해 종료합니다. 다만,jdb 환경에서 실행하고 있는 경우는, 예외가 발생하면(자) jdb 에 제어가 돌아옵니다. 다음에,jdb 를 사용해 예외의 원인을 진단합니다.

catch 커멘드를 사용하면(자), 디버그 하고 있는 어플리케이션은 다른 예외가 throw 되었을 때에 정지합니다. "예를 들어, 「catch java.io.FileNotFoundException」또는 「catch mypackage.BigTroubleException」와 같이 합니다. 예외가 특정의 클래스 (또는 서브 클래스)의 인스턴스의 경우는, 어플리케이션은 예외가 throw 된 장소에서 정지합니다.

ignore 커멘드를 사용하면(자), 이전의 catch 커멘드의 효과가 무효가 됩니다.

주:ignore 커멘드에서는, 디버그 되는 VM 는 예외를 무시하지 않고, 디버거만이 예외를 무시합니다.

커멘드행 옵션

커멘드행으로 Java 어플리케이션 기동 툴 대신에 jdb 를 사용하는 경우,jdb 는,-D,-classpath,-X<option> 등,java 커멘드와 같은 수의 옵션을 받아들입니다.

jdb 는, 그 외에 다음의 옵션을 받아들입니다.

-help
헬프 메세지를 표시합니다.
-sourcepath <dir1:dir2:...>
지정된 패스를 사용해, 원시 파일을 검색합니다. 이 옵션이 지정되어 있지 않은 경우는, 디폴트 패스의 「.」(이)가 사용됩니다.
-attach <address>
디폴트의 접속 기구를 사용해, 벌써 실행중의 VM 에 디버거를 접속합니다.
-listen <address>
실행중의 VM 가 표준의 연결기를 사용해 지정된 주소에 접속하는 것을 대기합니다.
-listenany
실행중의 VM 가 표준의 연결기를 사용해 이용 가능한 임의의 주소에 접속하는 것을 대기합니다.
-launch
디버그 하는 어플리케이션을 jdb 의 기동 후 즉시 기동합니다. 이 옵션에 의해,run 커멘드를 사용할 필요가 없어집니다. 디버그 하는 어플리케이션은, 기동 후, 초기 어플리케이션 클래스가 로드 되기 직전에 정지합니다. 그 시점에서, 필요한 breakpoint를 설정해,cont 를 사용해 실행을 계속할 수 있습니다.
-listconnectors
이 VM 로 이용할 수 있는 연결기를 일람표 가리킵니다.
-connect <connector-name>:<name1>=<value1>,...
일람표 나타난 인수의 값과 지정의 연결기를 사용해 타겟 VM 에 접속합니다.
-dbgtrace [flags]
jdb 의 디버그 정보를 출력합니다.
-tclient
Java HotSpot(tm) VM (클라이언트) 내에서 어플리케이션을 실행합니다.
-tserver
Java HotSpot(tm) VM (서버) 내에서 어플리케이션을 실행합니다.
-Joption
jdb 의 실행에 사용되는 Java 가상 머신에 option 를 건네줍니다. (어플리케이션 Java 가상 머신에 대한 옵션은,run 커멘드에게 건네진다. ) 예를 들어,-J-Xms48m 와 지정하면(자), 스타트 업 메모리는 48M 바이트로 설정됩니다.

디버거와 디버그를 실시하는 VM 를 접속하기 위한 대체 기구에 대해서, 그 외의 옵션이 지원되고 있습니다. 그 외의 접속 옵션에 대해서는, Java Platform Debugger Architecture 의문서를 참조해 주세요.

디버그 대상의 프로세스에 전송 되는 옵션

-v -verbose[:class|gc|jni]
장황 모드로 합니다.
-D<name>=<value>
시스템 프로퍼티을 설정합니다.
-classpath <directories separated by ":">
클래스를 검색하는 디렉토리를 일람표 가리킵니다.
-X<option>
비표준 타겟 VM 옵션입니다.

관련 항목

javac ,java ,javah ,javap ,javadoc


Copyright © 2002-2006 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software