Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Using java debugger
 
본격적인 자바 프로그램에 앞서 미리 익혀야 할 사항은 디버깅 방법이다. 디버깅없는 프로그램은 한마디로 무기없이 전쟁터에 나가는 것과 같다. ( 2003/02/28 ) 188
Written by ienvyou - 최지웅
1 of 1
 

자바 디버깅 방법

본격적인 자바 프로그램에 앞서 미리 익혀야 할 사항은 디버깅 방법이다.
 디버깅없는 프로그램은 한마디로 무기없이 전쟁터에 나가는 것과 같다. 
 특히 자바를 소개하는 대부분의 지면에서 디버거 사용에 소홀한 것 같다. 
 따라서 이번 기회에 확실히 자바 디버깅 방법을 익히도록 한다. 

디버거 컴파일 옵션
먼저 자바 디버깅을 위해 사용자는 -g 옵션을 주어 컴파일해야 한다. 

% javac -g HelloWorld.java [ 유닉스 ]

c:\> javac -g HelloWorld.java [ PC ]

애플릿뷰어 디버거 옵션
HelloWorld.html 파일의 자바 애플릿에 대해 디버거를 사용하기 위해 
다음과 같이 애플릿 뷰어를 실행시킨다.

% appletviewer -debug HelloWorld.html


자바 디버거 명령어 이해
다음은 실제 HelloWorld.html 이라는 애플릿을 디버깅하면서 
자바 디버깅시 필요한 명령어를 익혀본다. 

- 디버거를 구동한다.

% appletviewer -debug HelloWorld.html

Initializing jdb...
0xee311280:class(sun.applet.AppletViewer)

 

- 디버거에서 제공하는 명령어에 무엇이 있는지 조회하기 위해 help를 입력해본다. 
다음과 같이 명령어와 해당 명령어의 설명이 출력된다.
> help
** command list **

threads [threadgroup] -- list threads
thread  -- set default thread
suspend [thread id(s)] -- suspend threads (default: all)
resume [thread id(s)] -- resume threads (default: all)
where [thread id] | all -- dump a thread's stack
threadgroups -- list threadgroups
threadgroup  -- set current threadgroup

print  [id(s)] -- print object or field
dump  [id(s)] -- print all object information
locals -- print all local variables in current stack frame classes -- list currently known classes

methods  -- list a class's methods
stop in . -- set a breakpoint in a method
stop at : -- set a breakpoint at a line
up [n frames] -- move up a thread's stack
down [n frames] -- move down a thread's stack
clear : -- clear a breakpoint
step -- execute current line
cont -- continue execution from breakpoint

catch  -- break for the specified exception
ignore  -- ignore when the specified exception
list [line number] -- print source code
use [source file path] -- display or change the source path
memory -- report memory usage
gc -- free unused objects
load classname -- load Java class to be debugged

run  [args] -- start execution of a loaded Java class
!! -- repeat last command
help (or ?) -- list commands
exit (or quit) -- exit debugger

이 명령어중 자주 사용하는 중요한 것은 다음과 같다.
- threadgroups , 현재 수행중인 뜨레드 그룹의 목록을 보여준다.
> threadgroups
1. (java.lang.ThreadGroup)0xee3000b8 system
2. (java.lang.ThreadGroup)0xee300aa8 main

threads, 수행중인 모든 스레드의 목록을 보여준다. 
> threads

Group system:
1. (java.lang.Thread)0xee3001f8 clock handler cond.
2. (java.lang.Thread)0xee3002a0 Idle thread runni
3. (java.lang.Thread)0xee300318 Async Garbage Collector cond.
4. (java.lang.Thread)0xee300370 Finalizer thread cond.
5. (java.lang.Thread)0xee300a18 Debugger agent runni
6. (sun.tools.debug.BreakpointHandler)0xee30f708 Breakpoint handler cond.
Group main:
7. (java.lang.Thread)0xee3000a0 main suspended 

>
run , 애플릿뷰어를 수행시켜준다. 
> run
run sun.applet.AppletViewer HelloWorld.html 
running ...

main[1] threads
Group sun.applet.AppletViewer.main:

1. (sun.awt.motif.InputThread)0xee313090 AWT-Input running 

2. (java.lang.Thread)0xee3130b8 AWT-Motif cond. waiting 

3. (sun.awt.ScreenUpdater)0xee300858 Screen Updater cond. waiting 

Group group applet-HelloWorld.class:

4. (java.lang.Thread)0xee312f40 class cond. waiting 

main[1] exit

pid 1247 status 0

Received sigchild for 1247 exit=0

% exit

stop , breakpoing 지정
% appletviewer -debug HelloWorld.html

Initializing jdb...
0xee311280:class(sun.applet.AppletViewer)
stop in HelloWorld.paint
Breakpoint set in HelloWorld.paint

run
run sun.applet.AppletViewer HelloWorld.html 
running ...
main[1] 

Breakpoint hit: HelloWorld.paint (HelloWorld:10)

list , 현재 수행중인 소스코드의 breakpoing를 보여준다. 
AWT-Motif[1] 

AWT-Motif[1] list

6 int i;
7 
8 public void paint(Graphics g)
9 {
10 => i = 10;
11 g.drawString("Hellow world!" , 25 , 25);
12 }
13 }
14 

where , 현재 실행 스택을 보여준다.
AWT-Motif[1] where

[1] HelloWorld.paint (HelloWorld:10)
[2] sun.awt.motif.MComponentPeer.paint (MComponentPeer:122)
sun.awt.motif.MComponentPeer.handleExpose (MComponentPeer:246)
 
use , 자바가 소스파일을 찾기위한 경로를 보여준다. 기본적으로 CLASSPATH가 사용된다.
AWT-Motif[1] use
.:/usr/local/httpd/java/lib/classes.zip:/usr/local/httpd/java/bin
/../classes:/usr/local/httpd/java/bin/../lib/classes.zip:/usr/local/httpd/java/bin/../bin/
../classes:/usr/local/httpd/java/bin/../bin/../lib/classes.zip

dump , 객체에 대한 정보를 얻을 때 사용된다.
AWT-Motif[1] dump g

g = (sun.awt.motif.X11Graphics)0xee310d58 {
int pData = 1476744
Color foreground = (java.awt.Color)0xee300300
Font font = (java.awt.Font)0xee300268
int originX = 0
int originY = 0
Image image = null
}

step , 현재 소스코드중 한 라인만을 수행한다.
AWT-Motif[1] step
AWT-Motif[1] 
Breakpoint hit: HelloWorld.paint (HelloWorld:11)

AWT-Motif[1] list
7 
8 public void paint(Graphics g)
9 {
10 i = 10;
11 => g.drawString("Hellow world!" , 25 , 25);
12 }
13 }
14 

 

load 클래스이름 , 해당 클래스를 로드해준다.
> load HelloWorld
0xee310ea8:class(HelloWorld)
memory , 사용중인 메모리의 상황을 보여준다.
main[1] memory
Free: 577856, total: 1048568

gc , 사용하지 않은 객체를 프리해준다.
main[1] gc
main[1] memory
Free: 578904, total: 1048568


2001-06-20
 
1
References
 
java documentation
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD