티스토리 뷰

들어가며

  • 간혹 IDE가 없는 환경에서 Java 애플리케이션을 디버깅 해야 할때가 있다.
  • 이때 간단하게 사용할 수 있는 것이 JDK에 포함된 JDB 인데 기초적인 사용법만 알아도 유용하게 써먹을 수 있다. 

JDB란

  • JDB(Java Debugger)는 Java 클래스를 디버깅할 수 있는 간단한 Command-Line 디버거이다.
  • JDB 명령어에 대한 설명은 JDB를 실행하여 -help를 통해서 볼 수 있다. 
    • 위치는 JDK 폴더/bin/jdb.exe 

사용법

  • 이번 포스트에서는 간단하게 특정 값을 확인하고자 할때를 기준으로 주로 쓰이는 사용법에 대해서 이야기 한다.
  • 그리고 애플리케이션은 JAR를 통해서 실행한다고 가정한다.

JDB 실행 및 접속

  • 먼저 애플리케이션을 실행한다.
    • a.jar 파일을 실행하며 8000번 Socket을 열어둠
java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y -jar a.jar

 

  • 그 다음 JDB를 실행한다.
    • 위치는 JDK 폴더/bin/jdb.exe 
jdb -connect com.sun.jdi.SocketAttach:port=8000

//windows
jdb.exe -connect com.sun.jdi.SocketAttach:port=8000

 

  • 아래 메시지가 출력되면 정상적으로 접속 된 것이다.
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
VM Started: No frames on the current call stack

main[1]

Break Point 설정

  • Run을 하기 전에 원하는 위치에 Break Point를 걸어준다. 이때 방법은 크게 두가지이다.
    • 이때 참고해야 할 점은 클래스를 적어줄 때 패키지명을 포함한 Full-Path로 적어줘야 함
    • 모든 클래스들의 Full-Path를 출력하려면 classes를 사용

 

  • stop at: 특정 Line Number로 지정
//Service 클래스의 150번 째 줄에 BreakPoint
stop at com.my.package.service.Service:150

 

  • stop in:특정 메소드로 지정
//Service 클래스의 start() 메소드에 BreakPoint
stop at com.my.package.service.Service.start

 

  • clear: BreakPoint 삭제
//설정된 Break Point 삭제
clear <클래스 경로>:<라인 Number>
clear <클래스 경로>.<메소드명>
clear

실행

  • 실행은 run 명령을 통해서 간단하게 수행 가능하다.
  • 이후 BreakPoint에 Stop되었을 때 Line을 이동하는 방법은 아래와 같다.

 

  • step: 현재 라인 실행 (InteliJ의 Step Into)
  • step up: 현재 메소드 리턴까지 실행 (InteliJ의 Step Out)
  • next: 한 라인 건너띄기 (InteliJ의 Step Over)

값 확인

  • print <expr>: 입력한 value에 대한 출력
//Example
$ main[1] print args
$ args = instance of java.lang.String[0] (id=1501)

 

  • locals: 현재 stack에 해당되는 모든 지역변수 출력
//Example
main[1] locals
Method arguments:
args = instance of java.lang.String[0] (id=1501)
Local variables:

ETC

  • 그 밖의 Command 들은 아래 JDB Help를 참고하자.
** command list **
connectors                -- list available connectors and transports in this VM

run [class [args]]        -- start execution of application's main class

threads [threadgroup]     -- list threads
thread <thread id>        -- 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
wherei [<thread id> | all]-- dump a thread's stack, with pc info
up [n frames]             -- move up a thread's stack
down [n frames]           -- move down a thread's stack
kill <thread id> <expr>   -- kill a thread with the given exception object
interrupt <thread id>     -- interrupt a thread

print <expr>              -- print value of expression
dump <expr>               -- print all object information
eval <expr>               -- evaluate expression (same as print)
set <lvalue> = <expr>     -- assign new value to field/variable/array element
locals                    -- print all local variables in current stack frame

classes                   -- list currently known classes
class <class id>          -- show details of named class
methods <class id>        -- list a class's methods
fields <class id>         -- list a class's fields

threadgroups              -- list threadgroups
threadgroup <name>        -- set current threadgroup

stop in <class id>.<method>[(argument_type,...)]
                          -- set a breakpoint in a method
stop at <class id>:<line> -- set a breakpoint at a line
clear <class id>.<method>[(argument_type,...)]
                          -- clear a breakpoint in a method
clear <class id>:<line>   -- clear a breakpoint at a line
clear                     -- list breakpoints
catch [uncaught|caught|all] <class id>|<class pattern>
                          -- break when specified exception occurs
ignore [uncaught|caught|all] <class id>|<class pattern>
                          -- cancel 'catch' for the specified exception
watch [access|all] <class id>.<field name>
                          -- watch access/modifications to a field
unwatch [access|all] <class id>.<field name>
                          -- discontinue watching access/modifications to a field
trace [go] methods [thread]
                          -- trace method entries and exits.
                          -- All threads are suspended unless 'go' is specified
trace [go] method exit | exits [thread]
                          -- trace the current method's exit, or all methods' exits
                          -- All threads are suspended unless 'go' is specified
untrace [methods]         -- stop tracing method entrys and/or exits
step                      -- execute current line
step up                   -- execute until the current method returns to its caller
stepi                     -- execute current instruction
next                      -- step one line (step OVER calls)
cont                      -- continue execution from breakpoint

list [line number|method] -- print source code
use (or sourcepath) [source file path]
                          -- display or change the source path
exclude [<class pattern>, ... | "none"]
                          -- do not report step or method events for specified classes
classpath                 -- print classpath info from target VM

monitor <command>         -- execute command each time the program stops
monitor                   -- list monitors
unmonitor <monitor#>      -- delete a monitor
read <filename>           -- read and execute a command file

lock <expr>               -- print lock info for an object
threadlocks [thread id]   -- print lock info for a thread

pop                       -- pop the stack through and including the current frame
reenter                   -- same as pop, but current frame is reentered
redefine <class id> <class file name>
                          -- redefine the code for a class

disablegc <expr>          -- prevent garbage collection of an object
enablegc <expr>           -- permit garbage collection of an object

!!                        -- repeat last command
<n> <command>             -- repeat command n times
# <command>               -- discard (no-op)
help (or ?)               -- list commands
version                   -- print version information
exit (or quit)            -- exit debugger

<class id>: a full class name with package qualifiers
<class pattern>: a class name with a leading or trailing wildcard ('*')
<thread id>: thread number as reported in the 'threads' command
<expr>: a Java(TM) Programming Language expression.
Most common syntax is supported.
반응형
댓글