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

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

JAVA調(diào)試技術(shù)

2019-11-18 13:23:16
字體:
供稿:網(wǎng)友

  這份材料介紹java的調(diào)試技術(shù),范圍涵蓋普通程序和服務(wù)器端程序的調(diào)試。
    很多程序員并沒有熟悉到排除軟件的錯(cuò)誤的價(jià)值,假如你是一個(gè)JAVA開發(fā)者,就很值得讀一讀這個(gè)材料。在現(xiàn)代工具的幫助下,開發(fā)者成為一個(gè)好的調(diào)試者和成為一個(gè)好的程序員的重要性一樣。
    這個(gè)材料假設(shè)你已經(jīng)有基本的JAVA編程的知識(shí),假如你精通JAVA,這個(gè)材料也可以增加你很多知識(shí)。
    假如你有其他語言的調(diào)試經(jīng)驗(yàn),你可以跳過基本知識(shí)部分。
    即使是高級(jí)程序員開發(fā)的小程序也可能包含錯(cuò)誤。你只需要理解調(diào)試的概念并熟悉合適的工具就可以成為好的調(diào)試者。這份材料將講解JAVA調(diào)試的基本概念,也討論高級(jí)的調(diào)試類型。我們將瀏覽不同的技術(shù)并且提供一些好的建議去幫助避免,追蹤并最終修正程序的錯(cuò)誤。
    我們將通過一個(gè)調(diào)試范例以使你熟悉調(diào)試技術(shù)。我們也將使用開發(fā)源代碼工具Jikes 和JDB向你演示如何調(diào)試服務(wù)器端和客戶端程序。為了編譯和運(yùn)行范例代碼,你需要先安裝一個(gè)Java Development Kit (JDK) ,你可以參考后面的部分獲得Jikes 和 JDB調(diào)試器。
    關(guān)于作者
    假如對(duì)這個(gè)材料的內(nèi)容有任何問題,你可以聯(lián)系作者Laura Bennett, lbenn@us.ibm.com。
    假如對(duì)中文版的翻譯有何意見和建議,請(qǐng)聯(lián)系翻譯者cherami ,cherami@163.net 。
    Laura Bennett 是IBM的資深軟件工程師。她獲得Pace大學(xué)的計(jì)算機(jī)科學(xué)學(xué)士學(xué)位和Columbia大學(xué)的計(jì)算機(jī)科學(xué)碩士學(xué)位。她是developerWorks的JAVA傳教士,同時(shí)也是站點(diǎn)的建設(shè)者。在他的空余時(shí)間,她喜歡和她的Lego MindStorm 機(jī)器人玩樂以及和她四歲大的TinkerToys搭建物體。
    Cherami是一個(gè)軟件工程師,閑暇之余翻譯一些計(jì)算機(jī)文獻(xiàn),以期為中國的計(jì)算機(jī)軟件事業(yè)做出一點(diǎn)微薄的貢獻(xiàn)。
    調(diào)試的基礎(chǔ)知識(shí)
    開始的情況
    在JAVA語言的早期,一個(gè)典型的開發(fā)者使用非常陳舊的方法調(diào)試程序:使用System.out.PRintln() 方法。代碼的跟蹤信息被打印到控制臺(tái)、文件或者套接字。
    很少有人能在第一次就寫出完美的(沒有任何錯(cuò)誤)代碼。因此,市場(chǎng)熟悉到了對(duì)于像C++ 程序員使用的調(diào)試器那樣的工具的需要。Java開發(fā)者現(xiàn)在有很多調(diào)試工具可以選擇,選擇什么樣的工具依靠于你的技術(shù)等級(jí)。通常新手使用GUI調(diào)試工具而有更多經(jīng)驗(yàn)的程序員趨向于避免使用所見即所得的工具而更關(guān)心有更多的控制能力。沒有哪個(gè)開發(fā)者不使用任何調(diào)試工具。調(diào)試器答應(yīng)你穿越代碼,凍結(jié)輸出以及檢查變量。開發(fā)者越有經(jīng)驗(yàn),調(diào)試工具越可以幫助他更快定位程序問題的位置。
    Java調(diào)試器的類型
    這里有幾種Java調(diào)試技術(shù)的工具:
    IDE(集成開發(fā)環(huán)境) 包含它們自己的調(diào)試器 (例如IBM的VisualAge for Java, Symantec Visual Café以及 Borland JBuilder)
    單獨(dú)的GUI工具 (例如Jikes, Java 平臺(tái)調(diào)試器 javadt, 以及JProbe)
    基于文本和命令行的工具 (例如Sun JDB)
    野蠻的使用編輯器 (例如Notepad 或者 VI) 檢查堆棧描繪(stack traces)
    你使用的 JDK, JSDI, jsp, 和Html對(duì)你的選擇都有影響。
    IDE 和獨(dú)立的GUI 調(diào)試器對(duì)于初學(xué)者是最輕易的并且被證實(shí)是最節(jié)省時(shí)間的。調(diào)試器將引導(dǎo)你到程序崩潰的地方。在調(diào)試器里面執(zhí)行程序,使用鼠標(biāo)設(shè)置斷點(diǎn)并穿越代碼。使用這些調(diào)試器的不利方面是并非所有的IDE調(diào)試器都支持最新的Java API和技術(shù) (例如servlets 和 EJB 組件)。
    基于文本和野蠻的使用編輯器的技術(shù)提供更多的控制但是對(duì)于沒有太多經(jīng)驗(yàn)的程序員可能會(huì)花費(fèi)更長的時(shí)間找出錯(cuò)誤。我們稱它們?yōu)椤翱蓱z人的”調(diào)試方法。
    假如上面的都不滿足你的需求, Java平臺(tái)引入Java Debugging APIs使你可以創(chuàng)建符合你自己特定需求的調(diào)試器。
    調(diào)試類型
    這兒有很多調(diào)試方法,無論是在客戶端還是服務(wù)器端。我們?cè)谶@個(gè)材料里面包含下面的方法:
    基本的Java字節(jié)碼 (也就是使用System.out.println())
    使用注釋
    附加在一個(gè)正在運(yùn)行的程序上
    遠(yuǎn)程調(diào)試
    需求調(diào)試(Debugging on demand)
    優(yōu)化代碼的調(diào)試
    Servlet, JSP 文件以及EJB 組件的調(diào)試
    在后面會(huì)具體說明每一種類型的調(diào)試。
    共同的錯(cuò)誤類型
    為了給你一個(gè)你將碰到什么的提示,我們?cè)谙旅媪谐隽碎_發(fā)者一次又一次碰到的編輯或句法錯(cuò)誤 是你最先和最輕易碰到的錯(cuò)誤。它們通常是鍵入錯(cuò)誤引起的。
  邏輯錯(cuò)誤 不同于運(yùn)行時(shí)錯(cuò)誤,因?yàn)闆]有任何異常被拋出,但是輸出不是期望的東西。這些錯(cuò)誤的范圍從緩沖區(qū)溢出到內(nèi)存泄漏。
  運(yùn)行時(shí)錯(cuò)誤 在程序執(zhí)行時(shí)發(fā)生并且通常產(chǎn)生一個(gè)Java異常。
  線程錯(cuò)誤 是最難重復(fù)和跟蹤的。
  Java debugging APIs
    Sun已經(jīng)定義了調(diào)試的結(jié)構(gòu),它們稱之為JBUG。這是為了回應(yīng)對(duì)真正的Java調(diào)試器的需要做出的。這些APIs幫助程序員建立符合自己需要的調(diào)試器:
    接口應(yīng)該和語言的風(fēng)格一樣是面向?qū)ο蟮摹?
    例如線程和監(jiān)視器這樣的Java運(yùn)行時(shí)特性應(yīng)該被前面的支持。
    可以進(jìn)行遠(yuǎn)程調(diào)試。
    在通常操作下的安全性不能被損害。
    修正的Java Debugger (JDB) 既是體現(xiàn)Java Debugging API的概念,同時(shí)又是一個(gè)有用的調(diào)試工具。它用Java Debug Interface (JDI)重寫并且是JDK的一部分。 JDB將在后面具體討論。
    預(yù)備一個(gè)調(diào)試用的程序
    Java平臺(tái)為調(diào)試過程提供語言支持。
    你在用編譯器編譯你的程序時(shí)可以用編譯選項(xiàng)指示編譯器在目標(biāo)文件中產(chǎn)生符號(hào)信息。假如你使用其它的編譯器而不是javac,參考你的編譯器的文檔獲得如何生成帶有調(diào)試信息的目標(biāo)文件。
    假如你使用javac 編譯器創(chuàng)建調(diào)試代碼,使用-g 編譯選項(xiàng)。這個(gè)選項(xiàng)讓你在調(diào)試的時(shí)候可以檢查本機(jī)類實(shí)例和靜態(tài)變量。假如你沒有使用該選項(xiàng)生成你的類文件你也可以設(shè)置斷點(diǎn)和追蹤代碼,但是你將不能檢查變量。(斷點(diǎn)是手工指定的程序運(yùn)行停止的點(diǎn)。)
    即使你使用-g選項(xiàng)編譯你的程序也不能調(diào)試JAVA平臺(tái)的核心系統(tǒng)類的局部變量。假如你需要列出某些系統(tǒng)類的局部變量的列表,你需要使用-g選項(xiàng)編譯這些類,也就是使用-g選項(xiàng)重新編譯rt.jar 的類或者是 src.zip 里面的文件。然后指定你的 classpath 為正確的類文件使你用新編譯的類運(yùn)行你的程序。在Java 2下,使用 boot classpath 選項(xiàng)使得新類被首先加載。
    記住假如你使用 -O 選項(xiàng)優(yōu)化你的代碼,你就不能調(diào)試你的類。優(yōu)化會(huì)將所有的調(diào)試信息從類中去掉。
    注重: 檢查你的 CLASSPATH 環(huán)境變量是正確的才能讓調(diào)試器和Java 程序知道在哪兒尋找你的類庫。你也應(yīng)該檢查你的調(diào)試工具看是否需要其它的什么或者是環(huán)境變量。
    設(shè)置斷點(diǎn)
    調(diào)試的第一步就是找到代碼出錯(cuò)的位置。斷點(diǎn)設(shè)置能幫你完成這個(gè)。
    斷點(diǎn)是你你放置在程序里面的臨時(shí)標(biāo)記,它使得調(diào)試器知道在哪兒停止程序的執(zhí)行。例如,假如程序里面的某個(gè)申明引發(fā)問題,你可以將斷點(diǎn)設(shè)置在包含那個(gè)申明的行上,然后運(yùn)行程序。在那個(gè)申明被執(zhí)行前程序停止執(zhí)行。然后你可以檢查變量、寄存器,存儲(chǔ)器以及堆棧的內(nèi)容,然后跨過(或執(zhí)行)那個(gè)申明查看問題是怎么引起的。
    不同的調(diào)試器支持不同的斷點(diǎn)。一些通用的類型是:
    行斷點(diǎn) 在程序特定行的代碼被執(zhí)行前被引發(fā)。
    方法斷點(diǎn) 在到達(dá)被設(shè)置成斷點(diǎn)的方法時(shí)被引發(fā)。
    計(jì)數(shù)斷點(diǎn) 在某個(gè)計(jì)數(shù)器達(dá)到或超過某個(gè)特定值時(shí)被引發(fā)
    異常斷點(diǎn) 在代碼拋出一個(gè)特定異常時(shí)被引發(fā)
    儲(chǔ)存變化斷點(diǎn) 在存儲(chǔ)在特定地址范圍的內(nèi)容被修改時(shí)引發(fā)
    地址斷點(diǎn) 在被設(shè)置成斷點(diǎn)的地址達(dá)到時(shí)被引發(fā)
    注重: 一些調(diào)試器只在編譯版本的Java代碼 (使用just-in-time 編譯器生成的代碼) 上支持某些斷點(diǎn)類型而不支持解釋代碼(使用javac 工具生成的代碼)。一個(gè)例子就是地址斷點(diǎn)。每個(gè)工具在你能設(shè)置斷點(diǎn)的方式上可能有些不同。檢查你的工具的文檔。
    你可能會(huì)問,我如何知道在哪兒放置斷點(diǎn)?
    假如你對(duì)這個(gè)問題完全沒有感覺,你可以在main() 方法的開始設(shè)置斷點(diǎn)
    假如你的代碼產(chǎn)生堆棧復(fù)寫(stack trace), 在程序產(chǎn)生它的地方設(shè)置斷點(diǎn)。你將在堆棧復(fù)寫里面看到源代碼中出問題的行號(hào)。
    假如你的輸出或者圖形顯示的特定部分沒有正確的顯示預(yù)定信息(例如文本域顯示錯(cuò)誤的文本),你可以在該組件被創(chuàng)建的地方設(shè)置斷點(diǎn)。然后你可以單步執(zhí)行你的程序顯示和GUI對(duì)象相關(guān)的值。
    經(jīng)驗(yàn)將在最合適的地方設(shè)置斷點(diǎn)。你在一個(gè)類或者程序里面可以設(shè)置多個(gè)斷點(diǎn)。
    通常,你在調(diào)試代碼的時(shí)候會(huì)禁止、激活、添加、刪除斷點(diǎn)。工具會(huì)答應(yīng)你查看你所設(shè)置的所有斷點(diǎn)的位置同時(shí)給你一次刪除所有斷點(diǎn)的選項(xiàng)。
    單步執(zhí)行程序
    單步執(zhí)行程序是最終解決那些棘手的調(diào)試問題的方法。它答應(yīng)你追蹤類里面的方法體的整個(gè)執(zhí)行過程。注重,你不需要設(shè)置斷點(diǎn)就可以停止一個(gè)GUI程序的執(zhí)行。
    設(shè)置斷點(diǎn)后在調(diào)試器里面開始執(zhí)行程序,當(dāng)碰到第一個(gè)斷點(diǎn)后,你可以越過申明,進(jìn)入方法體或類體,也可以繼續(xù)運(yùn)行直到下一個(gè)斷點(diǎn)或程序結(jié)束。
    在調(diào)試程序的時(shí)候經(jīng)常碰到的術(shù)語有:
    進(jìn)入 執(zhí)行當(dāng)前行。假如當(dāng)前行包含一個(gè)方法調(diào)用,執(zhí)行被調(diào)用方法的第一行。假如類中的方法是用不帶調(diào)試信息的選項(xiàng)編譯的 (也就是沒有使用 -g 選項(xiàng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴业县| 木里| 固阳县| 武义县| 赣州市| 洛扎县| 静乐县| 长岭县| 巫山县| 曲阜市| 盐城市| 台山市| 宜城市| 龙口市| 嘉兴市| 呼玛县| 英吉沙县| 双城市| 汝南县| 治县。| 文水县| 叙永县| 苗栗县| 襄城县| 石河子市| 宜丰县| 梅州市| 贵南县| 津南区| 抚宁县| 公主岭市| 平泉县| 南皮县| 资源县| 永登县| 岳阳县| 古蔺县| 衡阳市| 海安县| 明光市| 团风县|