banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Rắc rối với jdb - The java debugger  XML
  [Programming]   Rắc rối với jdb - The java debugger 15/11/2010 18:03:47 (+0700) | #1 | 224939
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Chào các bạn. Mình có một rắc rối. Mình mong các bạn giúp đỡ.

Đây là nội dung mã nguồn. Nó không có gì đặc biệt. Vấn đề ở chỗ mình đang tìm cách debug nó bằng jdb và vẫn chưa thành công.
Code:
public class TestMe {

    private int int_value;
    private String string_value;

    public static void main(String[] args) {
        TestMe testMe = new TestMe();
        testMe.setInt_value(1);
        testMe.setString_value("test");
        String toString = testMe.toString();
	System.out.println(toString);
    }

    public TestMe() {
    }

    public void setInt_value(int value) {
        int_value = value;
    }

    public void setString_value(String value) {
        string_value = value;
    }

    @Override
    public String toString() {
        return "String value: " + string_value + " int value: " + int_value;
    }
}


File TestMe.java mình save tại I:\TestingZone

Mình thực hiện debug mã nguồn trên bằng jdb. Đây là hình ảnh trong command prompt của mình:
Code:
I:\TestingZone>javac -g TestMe.java

I:\TestingZone>jdb TestMe
Initializing jdb ...
> run
run TestMe
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started:
Exception occurred: java.lang.ClassNotFoundException (uncaught)"thread=main", ja
va.net.URLClassLoader$1.run(), line=202 bci=73

main[1]


Mình không hiểu tại sao lại bị lỗi ClassNotFoundException vì TestMe.class được tạo ra ngay tại thư mục I:\TestingZone. Mình không hề di dời nó đi đâu cả sau khi nó được tạo ra.

Bạn nào đó có thể chỉ cho mình lý do mình mắc lỗi này và cách sửa chữa nó được không ?
[Up] [Print Copy]
  [Programming]   Rắc rối với jdb - The java debugger 19/11/2010 01:19:27 (+0700) | #2 | 225155
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
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 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
[Up] [Print Copy]
  [Programming]   Rắc rối với jdb - The java debugger 19/11/2010 01:22:46 (+0700) | #3 | 225156
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Sao thẻ code lại không có tác dụng nhỉ. Vậy là không thể tự đưa thẻ định dạng vào bằng cách gõ tên thẻ đó.
Mình định edit lại những lại nhận được thông báo "Cấm truy cập".
Khi nào sử dụng lại được chức năng edit. Mình hứa sẽ sửa lại bài viết cho rõ ràng.
[Up] [Print Copy]
  [Programming]   Rắc rối với jdb - The java debugger 19/11/2010 16:06:10 (+0700) | #4 | 225203
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
File class của bạn nằm trong thư mục hiện thời, thường thì thư mục hiện thời sẽ tự được add vào classpath, nhưng đôi khi lại không(không có gì đảm bảo điều này cả) nên tốt nhất là cứ tự chỉ ra classpath như bạn đã làm.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|