




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、JAVA調(diào)試技術(shù)前言 這份材料介紹JAVA的調(diào)試技術(shù),范圍涵蓋普通程序和服務(wù)器端程序的調(diào)試。很多程序員并沒有認(rèn)識到排除軟件的錯誤的價值,如果你是一個JAVA開發(fā)者,就很值得讀一讀這個材料。在現(xiàn)代工具的幫助下,開發(fā)者成為一個好的調(diào)試者和成為一個好的程序員的重要性一樣。這個材料假設(shè)你已經(jīng)有基本的JAVA編程的知識,如果你精通JAVA,這個材料也可以增加你很多知識。如果你有其他語言的調(diào)試經(jīng)驗,你可以跳過基本知識部分。即使是高級程序員開發(fā)的小程序也可能包含錯誤。你只需要理解調(diào)試的概念并熟悉合適的工具就可以成為好的調(diào)試者。這份材料將講解JAVA調(diào)試的基本概念,也討論高級的調(diào)試類型。我們將瀏覽不同的技術(shù)并
2、且提供一些好的建議去幫助避免,追蹤并最終修正程序的錯誤。我們將通過一個調(diào)試范例以使你熟悉調(diào)試技術(shù)。我們也將使用開發(fā)源代碼工具Jikes 和JDB向你演示如何調(diào)試服務(wù)器端和客戶端程序。為了編譯和運行范例代碼,你需要先安裝一個Java Development Kit (JDK) ,你可以參考后面的部分獲得Jikes 和 JDB調(diào)試器。關(guān)于作者如果對這個材料的內(nèi)容有任何問題,你可以聯(lián)系作者Laura Bennett, lbenn。如果對中文版的翻譯有何意見和建議,請聯(lián)系翻譯者cherami ,cherami 。Laura Bennett 是IBM的資深軟件工程師。她獲得Pace大學(xué)的計算機(jī)科學(xué)學(xué)士學(xué)
3、位和Columbia大學(xué)的計算機(jī)科學(xué)碩士學(xué)位。她是developerWorks的JAVA傳教士,同時也是站點的建設(shè)者。在他的空余時間,她喜歡和她的Lego MindStorm 機(jī)器人玩樂以及和她四歲大的TinkerToys搭建物體。Cherami是一個軟件工程師,閑暇之余翻譯一些計算機(jī)文獻(xiàn),以期為中國的計算機(jī)軟件事業(yè)做出一點微薄的貢獻(xiàn)。 調(diào)試的基礎(chǔ)知識開始的情況在JAVA語言的早期,一個典型的開發(fā)者使用非常陳舊的方法調(diào)試程序:使用System.out.println() 方法。代碼的跟蹤信息被打印到控制臺、文件或者套接字。很少有人能在第一次就寫出完美的(沒有任何錯誤)代碼
4、。因此,市場認(rèn)識到了對于像C+ 程序員使用的調(diào)試器那樣的工具的需要。Java開發(fā)者現(xiàn)在有很多調(diào)試工具可以選擇,選擇什么樣的工具依賴于你的技術(shù)等級。通常新手使用GUI調(diào)試工具而有更多經(jīng)驗的程序員趨向于避免使用所見即所得的工具而更關(guān)心有更多的控制能力。沒有哪個開發(fā)者不使用任何調(diào)試工具。調(diào)試器允許你穿越代碼,凍結(jié)輸出以及檢查變量。開發(fā)者越有經(jīng)驗,調(diào)試工具越可以幫助他更快定位程序問題的位置。Java調(diào)試器的類型這里有幾種Java調(diào)試技術(shù)的工具:· IDE(集成開發(fā)環(huán)境) 包含它們自己的調(diào)試器 (例如IBM的VisualAge for Java, Symantec Visual Caf
5、3;以及 Borland JBuilder) · 單獨的GUI工具 (例如Jikes, Java 平臺調(diào)試器 javadt, 以及JProbe) · 基于文本和命令行的工具 (例如Sun JDB) · 野蠻的使用編輯器 (例如Notepad 或者 VI) 檢查堆棧描繪(stack traces)你使用的 JDK, JSDI, JSP, 和HTML對你的選擇都有影響。IDE 和獨立的GUI 調(diào)試器對于初學(xué)者是最容易的并且被證明是最節(jié)省時間的。調(diào)試器將引導(dǎo)你到程序崩潰的地方。在調(diào)試器里面執(zhí)行程序,使用鼠標(biāo)設(shè)置斷點并穿越代碼。使用這些調(diào)試器的不利方面是并非所有的IDE調(diào)
6、試器都支持最新的Java API和技術(shù) (例如servlets 和 EJB 組件)。基于文本和野蠻的使用編輯器的技術(shù)提供更多的控制但是對于沒有太多經(jīng)驗的程序員可能會花費更長的時間找出錯誤。我們稱它們?yōu)椤翱蓱z人的”調(diào)試方法。如果上面的都不滿足你的需求, Java平臺引入Java Debugging APIs使你可以創(chuàng)建符合你自己特定需求的調(diào)試器。 調(diào)試類型這兒有很多調(diào)試方法,無論是在客戶端還是服務(wù)器端。我們在這個材料里面包含下面的方法:· 基本的Java字節(jié)碼 (也就是使用System.out.println() · 使用注釋 · 附加在一個正在運行的程序上
7、83; 遠(yuǎn)程調(diào)試 · 需求調(diào)試(Debugging on demand) · 優(yōu)化代碼的調(diào)試 · Servlet, JSP 文件以及EJB 組件的調(diào)試在后面會詳細(xì)說明每一種類型的調(diào)試。共同的錯誤類型為了給你一個你將遇到什么的提示,我們在下面列出了開發(fā)者一次又一次遇到的普遍錯誤:· 編輯或句法錯誤 是你最先和最容易遇到的錯誤。它們通常是鍵入錯誤引起的。 · 邏輯錯誤 不同于運行時錯誤,因為沒有任何異常被拋出,但是輸出不是期望的東西。這些錯誤的范圍從緩沖區(qū)溢出到內(nèi)存泄漏。 · 運行時錯誤 在程序執(zhí)行時發(fā)生并且通常產(chǎn)生一個Java異常。 &
8、#183; 線程錯誤 是最難重復(fù)和跟蹤的。Java debugging APIsSun已經(jīng)定義了調(diào)試的結(jié)構(gòu),它們稱之為JBUG。這是為了回應(yīng)對真正的Java調(diào)試器的需要做出的。這些APIs幫助程序員建立符合自己需要的調(diào)試器:· 接口應(yīng)該和語言的風(fēng)格一樣是面向?qū)ο蟮摹?· 例如線程和監(jiān)視器這樣的Java運行時特性應(yīng)該被前面的支持。 · 可以進(jìn)行遠(yuǎn)程調(diào)試。 · 在通常操作下的安全性不能被損害。修正的Java Debugger (JDB) 既是體現(xiàn)Java Debugging API的概念,同時又是一個有用的調(diào)試工具。它用Java Debug Interfac
9、e (JDI)重寫并且是JDK的一部分。 JDB將在后面詳細(xì)討論。準(zhǔn)備一個調(diào)試用的程序Java平臺為調(diào)試過程提供語言支持。你在用編譯器編譯你的程序時可以用編譯選項指示編譯器在目標(biāo)文件中產(chǎn)生符號信息。如果你使用其它的編譯器而不是javac,參考你的編譯器的文檔獲得如何生成帶有調(diào)試信息的目標(biāo)文件。如果你使用javac 編譯器創(chuàng)建調(diào)試代碼,使用-g 編譯選項。這個選項讓你在調(diào)試的時候可以檢查本機(jī)類實例和靜態(tài)變量。如果你沒有使用該選項生成你的類文件你也可以設(shè)置斷點和追蹤代碼,但是你將不能檢查變量。(斷點是手工指定的程序運行停止的點。)即使你使用-g選項編譯你的程序也不能調(diào)試JAVA平臺的核心系統(tǒng)類的局
10、部變量。如果你需要列出某些系統(tǒng)類的局部變量的列表,你需要使用-g選項編譯這些類,也就是使用-g選項重新編譯rt.jar 的類或者是 src.zip 里面的文件。然后指定你的 classpath 為正確的類文件使你用新編譯的類運行你的程序。在Java 2下,使用 boot classpath 選項使得新類被首先加載。記住如果你使用 -O 選項優(yōu)化你的代碼,你就不能調(diào)試你的類。優(yōu)化會將所有的調(diào)試信息從類中去掉。注意: 檢查你的 CLASSPATH 環(huán)境變量是正確的才能讓調(diào)試器和Java 程序知道在哪兒尋找你的類庫。你也應(yīng)該檢查你的調(diào)試工具看是否需要其它的什么或者是環(huán)境變量。設(shè)置斷點調(diào)試的第一步就是
11、找到代碼出錯的位置。斷點設(shè)置能幫你完成這個。斷點是你你放置在程序里面的臨時標(biāo)記,它使得調(diào)試器知道在哪兒停止程序的執(zhí)行。例如,如果程序里面的某個申明引發(fā)問題,你可以將斷點設(shè)置在包含那個申明的行上,然后運行程序。在那個申明被執(zhí)行前程序停止執(zhí)行。然后你可以檢查變量、寄存器,存儲器以及堆棧的內(nèi)容,然后跨過(或執(zhí)行)那個申明查看問題是怎么引起的。不同的調(diào)試器支持不同的斷點。一些通用的類型是:· 行斷點 在程序特定行的代碼被執(zhí)行前被引發(fā)。 · 方法斷點 在到達(dá)被設(shè)置成斷點的方法時被引發(fā)。 · 計數(shù)斷點 在某個計數(shù)器達(dá)到或超過某個特定值時被引發(fā) · 異常斷點 在代碼拋
12、出一個特定異常時被引發(fā) · 儲存變化斷點 在存儲在特定地址范圍的內(nèi)容被修改時引發(fā) · 地址斷點 在被設(shè)置成斷點的地址達(dá)到時被引發(fā)注意: 一些調(diào)試器只在編譯版本的Java代碼 (使用just-in-time 編譯器生成的代碼) 上支持某些斷點類型而不支持解釋代碼(使用javac 工具生成的代碼)。一個例子就是地址斷點。每個工具在你能設(shè)置斷點的方式上可能有些不同。檢查你的工具的文檔。你可能會問,我如何知道在哪兒放置斷點? · 如果你對這個問題完全沒有感覺,你可以在main() 方法的開始設(shè)置斷點 · 如果你的代碼產(chǎn)生堆棧復(fù)寫(stack trace), 在程
13、序產(chǎn)生它的地方設(shè)置斷點。你將在堆棧復(fù)寫里面看到源代碼中出問題的行號。 · 如果你的輸出或者圖形顯示的特定部分沒有正確的顯示預(yù)定信息(例如文本域顯示錯誤的文本),你可以在該組件被創(chuàng)建的地方設(shè)置斷點。然后你可以單步執(zhí)行你的程序顯示和GUI對象相關(guān)的值。經(jīng)驗將在最合適的地方設(shè)置斷點。你在一個類或者程序里面可以設(shè)置多個斷點。通常,你在調(diào)試代碼的時候會禁止、激活、添加、刪除斷點。工具會允許你查看你所設(shè)置的所有斷點的位置同時給你一次刪除所有斷點的選項。單步執(zhí)行程序單步執(zhí)行程序是最終解決那些棘手的調(diào)試問題的方法。它允許你追蹤類里面的方法體的整個執(zhí)行過程。注意,你不需要設(shè)置斷點就可以停止一個GUI程
14、序的執(zhí)行。設(shè)置斷點后在調(diào)試器里面開始執(zhí)行程序,當(dāng)遇到第一個斷點后,你可以越過申明,進(jìn)入方法體或類體,也可以繼續(xù)運行直到下一個斷點或程序結(jié)束。在調(diào)試程序的時候經(jīng)常遇到的術(shù)語有:· 進(jìn)入 執(zhí)行當(dāng)前行。如果當(dāng)前行包含一個方法調(diào)用,執(zhí)行被調(diào)用方法的第一行。如果類中的方法是用不帶調(diào)試信息的選項編譯的 (也就是沒有使用 -g 選項), 你將看到No Source Available 消息。 · 越過 執(zhí)行當(dāng)前行而不會因為該行調(diào)用了一個方法或例程而停止。 · 返回 從當(dāng)前執(zhí)行點執(zhí)行并立即返回到調(diào)用當(dāng)前方法的行。檢查變量通常,程序會因為一個變量的值沒有正確設(shè)置而進(jìn)行核心轉(zhuǎn)儲(co
15、re dump)。最常見的是試圖進(jìn)行一個值為null 的計算或比較以及除零。找出這種問題的最簡單的辦法是在錯誤發(fā)生的地方檢查變量的值。最通常的情況是變量在那點沒有得到預(yù)期分配的值。可視化調(diào)試器通常有一個監(jiān)視窗口顯示你當(dāng)前正在執(zhí)行的類的所有局部變量的值。某些調(diào)試器甚至顯示變量的地址或更進(jìn)一步的允許你動態(tài)的改變變量的值以查看如果值是你原來預(yù)想的情況時程序是否能繼續(xù)執(zhí)行。命令行調(diào)試器通常提供命令提供相應(yīng)的特性。使用命令行特性,你甚至可以通過顯示數(shù)組的每一行和每一列的內(nèi)容來查看整個數(shù)組。雖然大多調(diào)試器只在監(jiān)視窗口顯示類里面的局部變量,還是有一些調(diào)試器允許你在變量超出范圍后繼續(xù)監(jiān)視它。一些調(diào)試器支持查看
16、寄存器。注意這只能是查看編譯的Java 程序而不能是解釋的程序(字節(jié)碼程序)。堆棧復(fù)寫(Stack traces)當(dāng)Java 程序進(jìn)行內(nèi)核轉(zhuǎn)儲(core dumps)時它在控制臺產(chǎn)生我們稱之為堆棧復(fù)寫(stack trace) 的東西。堆棧復(fù)寫告訴開發(fā)者程序發(fā)生問題的精確路徑。它將說明類和方法名以及源代碼中的行數(shù) (如果你使用調(diào)試選項編譯)。如果你在發(fā)生堆棧復(fù)寫的開始處開始調(diào)試并停下,你可以向后查看你的代碼看看實際上是什么申明被執(zhí)行了。這是一個快速發(fā)現(xiàn)程序問題的辦法。你也可以使用下面的一個方法手動強制產(chǎn)生堆棧復(fù)寫。· Throwable().printStackTrace() 在調(diào)用
17、該方法的那個點產(chǎn)生堆棧復(fù)寫。復(fù)寫將顯示方法調(diào)用所涉及到的線程。 · Thread.currentThread.dumpStack() 只產(chǎn)生當(dāng)前線程的一個快照。當(dāng)你需要理解在什么條件下你的程序會產(chǎn)生堆棧復(fù)寫時使用強制復(fù)寫。下面的程序是一個強制堆棧復(fù)寫的例子。這個程序片斷進(jìn)行文件拷貝。我們通過比較兩個文件的長度是否相等來判斷拷貝是否成功。如果不相等,我們向文件寫入復(fù)寫然后強制打印堆棧復(fù)寫(參看黑體的申明)。Throwable() 是java.lang 中的一個類, printStackTrace() 是Throwable() 的一個方法,它打印程序執(zhí)行路徑的復(fù)寫。 publi
18、c static boolean copyFile( String sourceFile, String targetFile) . . / see if the copy succeeded. if (success) / see if the correct number of bytes were copied long newFileLength = new File(targetFile).length(); if (oldFileLength != newFileLength) Debug.trace(1, sourceFile + Constants.BLANK_STRING + Long.toString(oldFileLength); Debug.trace(1, targetFile + Constants.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家禽防疫隊管理制度
- 強化了制度管理制度
- 彩鋼房消防管理制度
- 得利斯信用管理制度
- 心理疏導(dǎo)站管理制度
- 快樂惠超市管理制度
- 快餐廳店面管理制度
- 急診icu管理制度
- 情侶零花錢管理制度
- 慈善會票據(jù)管理制度
- DB50T 1125.6-2021區(qū)域性氣象災(zāi)害過程評估規(guī)范 第6部分:降雪
- 應(yīng)用寫作技能與規(guī)范(天津大學(xué))【超星爾雅學(xué)習(xí)通】網(wǎng)課章節(jié)答案
- 放射科-模擬CT增強造影突發(fā)過敏性休克的急救
- 收款賬戶確認(rèn)書四篇
- 蘇菲新生兒呼吸機(jī)操作手冊(中文)
- 市場監(jiān)督管理局企業(yè)注冊、經(jīng)營范圍登記規(guī)范表述:行業(yè)分類及條目代碼
- 廣西大學(xué)宏觀經(jīng)濟(jì)學(xué)期末復(fù)習(xí)題及參考答案
- GB/T 5780-2016六角頭螺栓C級
- GB/T 31997-2015風(fēng)力發(fā)電場項目建設(shè)工程驗收規(guī)程
- GB/T 24926-2010全地形車制動性能要求及試驗方法
- GB/T 10410-2008人工煤氣和液化石油氣常量組分氣相色譜分析法
評論
0/150
提交評論