国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JDB 的簡(jiǎn)單使用

2019-11-18 11:02:36
字體:
供稿:網(wǎng)友

 


當(dāng)新手開始學(xué)習(xí)java時(shí),在一開始的新鮮感后馬上就會(huì)發(fā)現(xiàn)的一個(gè)問題就是如何調(diào)試。大家知道在Visual C++中提供了很好的調(diào)試工具,使用起來非凡的方便。Java中,以JDK為例,沒有一個(gè)方便的圖形界面,所以給新手調(diào)試帶來了很多的困難。很多人一開始是用System.out.PRintln()來觀察輸出結(jié)果。假如寫的程序很大,這樣的方法就顯然是效率太低。下面結(jié)合自己的學(xué)習(xí)體會(huì)簡(jiǎn)單談一下Java中的調(diào)試工具JDB的使用。
環(huán)境:jdk 1.2.2

首先我們寫一個(gè)最簡(jiǎn)單的小程序,但是它包含了一些最基本的面向?qū)ο笠亍?
class test
{
int a;
int b;
test(int aa,int bb)
{
a = aa;
b = bb;
}
int add()
{return a+b;}
}
public class hehe
{
public static void main(String args[])
{
int a = 2;
int b = 3;
int c= a+b;
System.out.println(c);
test kk=new test(1,2);
System.out.println(kk.add());
}
}

存為hehe.java后,用javac -g hehe.java進(jìn)行編譯。用參數(shù)g是為了產(chǎn)生各種調(diào)試信息,不用就無法調(diào)試。假如這里碰到問題,請(qǐng)參考Helloworld攻略。上面的程序是可以通過的,可以直接用java hehe運(yùn)行。下面結(jié)合該例子談?wù)凧DB的使用。

首先鍵入jdb hehe 假如出現(xiàn)下面信息,說明系統(tǒng)沒有找到調(diào)試的類。此時(shí)可以用java -classpath . hehe命令解決。
C:/javasource>jdb hehe
Initializing jdb...
hehe not found
>

假如出現(xiàn)一下信息,說明開始進(jìn)行調(diào)試,一切正常。假如是調(diào)試Applet,則用 appletviewer -debug hehe.Html命令進(jìn)行調(diào)試
C:/javasource>jdb -classpath . hehe
Initializing jdb...
0xb0:class(hehe)
>

回想VC中的調(diào)試,應(yīng)該是設(shè)置斷點(diǎn),然后再進(jìn)行跟蹤。Java中也是一樣。用stop命令進(jìn)行斷點(diǎn)設(shè)置。然后用 run 命令開始調(diào)試,運(yùn)行程序到斷點(diǎn),這里斷點(diǎn)是設(shè)置在 main 主函數(shù)中。
> stop at hehe:18
Breakpoint set at hehe:18
> run
run hehe
running ...
main[1]
Breakpoint hit: hehe.main (hehe:18)
main[1]

此時(shí)可以用locals命令查看變量,用step命令進(jìn)入下一條命令,也可以用單獨(dú)一個(gè)stop命令來查看斷點(diǎn)的設(shè)置情況。注重此時(shí)b還沒有被賦值。 main[1] locals
Method arguments:
Local variables:
args =
a = 2
main[1] step
main[1]
Breakpoint hit: hehe.main (hehe:19)
main[1]

當(dāng)運(yùn)行到System.out.println()函數(shù)時(shí),會(huì)出現(xiàn)一下提示:
main[1] step
main[1]
Breakpoint hit: java.lang.ClassLoader.loadClass (ClassLoader:247)

這個(gè)是因?yàn)槲覀兏欉M(jìn)去了println方法,我們一般沒有必要這樣做,此時(shí)可以用next跳過該方法進(jìn)入到下一條一句。step的含義是進(jìn)入函數(shù)跟蹤,next是轉(zhuǎn)入下一條語句執(zhí)行。我們隨時(shí)可以鍵入 locals 和 list 命令來查看變量值和當(dāng)前運(yùn)行的代碼。下面箭頭指到地方即為當(dāng)前程序運(yùn)行到的地方。
main[1] next
main[1]
Breakpoint hit: hehe.main (hehe:20)
main[1] list
16 {
17 int a = 2;
18 int b = 3;
19 int c= a+b;
20 => System.out.println(c);
21 test kk=new test(1,2);
22 System.out.println(kk.add());
23
24 }
main[1]

接下來的問題自然是如何查看對(duì)象。當(dāng)程序運(yùn)行到new命令處時(shí),鍵入locals,可以看到 main[1] step
main[1]
Breakpoint hit: test. (test:5)
main[1] list
1 class test
2 {
3 int a;
4 int b;
5 => test(int aa,int bb)
6 {
7 a = aa;
8 b = bb;
9 }
main[1] locals
Method arguments:
Local variables:
this = test@64fd6722
aa = 1
bb = 2
main[1]

可以看到此時(shí)顯示的變量值是類test中構(gòu)造函數(shù)中的變量值。this對(duì)象即為當(dāng)前構(gòu)造的對(duì)象。可以用dump命令進(jìn)行查看。
main[1] dump this
this = (test)0x11a {
int b = 0
int a = 0
}

也可以在main函數(shù)中用dump kk和print命令命令進(jìn)行對(duì)象查看 main[1] dump kk
kk = (test)0x11a {
int b = 2
int a = 1
}
main[1] print kk
kk = test@64fd6722
main[1] print kk.a
kk.a = 1
main[1] print kk.b
kk.b = 2

最后鍵入cont命令,假如沒有其他斷點(diǎn),程序就直接運(yùn)行完畢退出。調(diào)試結(jié)束。 main[1] cont
3

> Current thread "main" died. Execution continuing...
>
hehe exited

上述操作中的斷點(diǎn)都是設(shè)置在main函數(shù)中的,假如要設(shè)置在調(diào)用的類方法中,則要用 stop in yourclassname.functionname 命令來進(jìn)行設(shè)置,比如說: > stop in test.add
Breakpoint set in test.add
> run
run hehe
running ...
main[1] 5
Breakpoint hit: test.add (test:11)
main[1] list
7 a = aa;
8 b = bb;
9 }
10 int add()
11 => {return a+b;}
12 }
13 public class hehe
14 {
15 public static void main(String args[])
main[1]

這樣的話,我們已經(jīng)可以在程序中的幾乎所有需要地方的地方進(jìn)行斷點(diǎn)設(shè)置并進(jìn)行跟蹤,查看變量。
JDB還有很多的調(diào)試手段,除了上面那些最常用的,其他很重要的還有clear清除斷點(diǎn),use設(shè)置源程序路徑,memory顯示當(dāng)前內(nèi)存使用狀況,gc強(qiáng)制進(jìn)行內(nèi)存回收,!!重復(fù)上面的命令,thread設(shè)置當(dāng)前線程,quit和exit退出jdb等,還有遠(yuǎn)程調(diào)試等內(nèi)容,都很有用。這里就不一一介紹了。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁明县| 涟水县| 平湖市| 宣恩县| 视频| 麻阳| 凤凰县| 四会市| 宝应县| 德庆县| 乐业县| 高密市| 阳朔县| 涞水县| 迁西县| 台北市| 攀枝花市| 亚东县| 阿瓦提县| 邵东县| 盘山县| 成武县| 博爱县| 桓台县| 曲水县| 梁河县| 孝昌县| 西充县| 沽源县| 甘南县| 新泰市| 安平县| 翁源县| 大化| 祁连县| 鸡东县| 山东| 那坡县| 贵定县| 义乌市| 阜新市|