Mình đã biết tại sao lại bị lỗi đó rồi. Mình chưa có tham số khai báo classpath.
Lạ thật, mình tham khảo tài liệu hướng dẫn của sun thì không thấy đề cập gì đến khai báo classpath cả:
http://download.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html
Khi mình thực hành sử dụng jdb, mình có xem hướng dẫn trên javaworld và cũng không thấy có lưu ý về việc này:
http://www.javaworld.com/javaworld/javaqa/2000-06/04-qa-0623-jdb.html
Mã nguồn mình dùng để debug mình cũng lấy từ hướng dẫn trên javaworld.
Mình đã mất công tìm hiểu về cách sử dụng jdb thì mình nghĩ cũng nên dành ít thời gian trình bày nó. Bạn nào thích command line thì có lẽ cũng sẽ thích dùng thử cái jdb này.
Vẫn mã nguồn như trên và file TestMe.java vẫn nằm tại I:\TestingZone.
Mình thực hiện debug bằng jdb như sau. Đây là command prompt của mình:
Code:
I:\TestingZone>javac -g TestMe.java
I:\TestingZone>jdb -classpath . TestMe
Initializing jdb ...
> stop in TestMe.main
Deferring breakpoint TestMe.main.
It will be set after the class is loaded.
> [b]run[/b]
run TestMe
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint TestMe.main
Breakpoint hit: "thread=main", TestMe.main(), line=7 bci=0
7 TestMe testMe = new TestMe();
main[1] step
>
Step completed: "thread=main", TestMe.<init>(), line=14 bci=0
14 public TestMe() {
main[1] step
Chương trình của bạn bị dừng lại tại breakpoint đã set. Ở đây là dòng đầu tiên của main method của class TestMe. Để chạy các dòng lệnh kế tiếp nhau bạn dùng lệnh step.
Nếu muốn set breakpoint theo line number thì bạn có thể sử dụng cú pháp sau:
stop at <class id>:<line>
Bạn cũng có thể in thông tin về các object khi đang debug. Muốn làm được vây, bạn sẽ dùng một số command như print, dump.
Ví dụ:
Code:
Step completed: "thread=main", TestMe.main(), line=11 bci=24
11 System.out.println(toString);
main[1] print testMe
testMe = "String value: test int value: 1"
main[1] print testMe.int_value
testMe.int_value = 1
main[1] dump testMe
testMe = {
int_value: 1
string_value: "test"
}
main[1]
Bạn cũng có thể in ra toàn bộ local variable trong method hiện tại bằnng cách dùng locals
Ví dụ:
Code:
main[1] locals
Method arguments:
args = instance of java.lang.String[0] (id=335)
Local variables:
testMe = instance of TestMe(id=331)
toString = "String value: test int value: 1"
main[1]
Bạn còn có thể xem được toàn bộ member của một class bằng cách dùng các command: methods và fields
Ví dụ:
Code:
main[1] methods TestMe
** methods list **
TestMe main(java.lang.String[])
TestMe <init>()
TestMe setInt_value(int)
TestMe setString_value(java.lang.String)
TestMe toString()
java.lang.Object <init>()
java.lang.Object registerNatives()
java.lang.Object getClass()
java.lang.Object hashCode()
java.lang.Object equals(java.lang.Object)
java.lang.Object clone()
java.lang.Object toString()
java.lang.Object notify()
java.lang.Object notifyAll()
java.lang.Object wait(long)
java.lang.Object wait(long, int)
java.lang.Object wait()
java.lang.Object finalize()
java.lang.Object <clinit>()
main[1] fields TestMe
** fields list **
int int_value
java.lang.String string_value
Nếu bạn cần quản lý các thread trong chương trình bạn có thể sử dụng lênh threads để xem các thread đang tồn tại trong chương trình của bạn.
Ví dụ:
Code:
main[1] threads
Group system:
(java.lang.ref.Reference$ReferenceHandler)0x127 Reference Handler cond. waiting
(java.lang.ref.Finalizer$FinalizerThread)0x126 Finalizer cond. waiting
(java.lang.Thread)0x125 Signal Dispatcher running
(java.lang.Thread)0x124 Attach Listener running
Group main:
(java.lang.Thread)0x1 main running
main[1]
Nếu muốn tìm hiểu thêm, bạn có thể xem hướng dẫn qua help command.
Nguồn tham khảo:
- http://www.javaworld.com/javaworld/javaqa/2000-06/04-qa-0623-jdb.html
- http://download.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html