熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

JAVA調試技術

2013-11-23 17:56:23  來源: Javascript 

  這份材料介紹JAVA的調試技術范圍涵蓋普通程序和服務器端程序的調試
    很多程序員並沒有認識到排除軟件的錯誤的價值如果你是一個JAVA開發者就很值得讀一讀這個材料在現代工具的幫助下開發者成為一個好的調試者和成為一個好的程序員的重要性一樣
    這個材料假設你已經有基本的JAVA編程的知識如果你精通JAVA這個材料也可以增加你很多知識
    如果你有其他語言的調試經驗你可以跳過基本知識部分
    即使是高級程序員開發的小程序也可能包含錯誤你只需要理解調試的概念並熟悉合適的工具就可以成為好的調試者這份材料將講解JAVA調試的基本概念也討論高級的調試類型我們將浏覽不同的技術並且提供一些好的建議去幫助避免追蹤並最終修正程序的錯誤
    我們將通過一個調試范例以使你熟悉調試技術我們也將使用開發源代碼工具Jikes 和JDB向你演示如何調試服務器端和客戶端程序為了編譯和運行范例代碼你需要先安裝一個Java Development Kit (JDK) 你可以參考後面的部分獲得Jikes 和 JDB調試器
    關於作者
    如果對這個材料的內容有任何問題你可以聯系作者Laura Bennett
    如果對中文版的翻譯有何意見和建議請聯系翻譯者cherami
    Laura Bennett 是IBM的資深軟件工程師她獲得Pace大學的計算機科學學士學位和Columbia大學的計算機科學碩士學位她是developerWorks的JAVA傳教士同時也是站點的建設者在他的空余時間她喜歡和她的Lego MindStorm 機器人玩樂以及和她四歲大的TinkerToys搭建物體
    Cherami是一個軟件工程師閒暇之余翻譯一些計算機文獻以期為中國的計算機軟件事業做出一點微薄的貢獻
    調試的基礎知識
    開始的情況
    在JAVA語言的早期一個典型的開發者使用非常陳舊的方法調試程序使用Systemoutprintln() 方法代碼的跟蹤信息被打印到控制台文件或者套接字
    很少有人能在第一次就寫出完美的(沒有任何錯誤)代碼因此市場認識到了對於像C++ 程序員使用的調試器那樣的工具的需要Java開發者現在有很多調試工具可以選擇選擇什麼樣的工具依賴於你的技術等級通常新手使用GUI調試工具而有更多經驗的程序員趨向於避免使用所見即所得的工具而更關心有更多的控制能力沒有哪個開發者不使用任何調試工具調試器允許你穿越代碼凍結輸出以及檢查變量開發者越有經驗調試工具越可以幫助他更快定位程序問題的位置
    Java調試器的類型
    這裡有幾種Java調試技術的工具:
    IDE(集成開發環境) 包含它們自己的調試器 (例如IBM的VisualAge for Java Symantec Visual Café以及 Borland JBuilder)
    單獨的GUI工具 (例如Jikes Java 平台調試器 javadt 以及JProbe)
    基於文本和命令行的工具 (例如Sun JDB)
    野蠻的使用編輯器 (例如Notepad 或者 VI) 檢查堆棧描繪(stack traces)
    你使用的 JDK JSDI JSP 和HTML對你的選擇都有影響
    IDE 和獨立的GUI 調試器對於初學者是最容易的並且被證明是最節省時間的調試器將引導你到程序崩潰的地方在調試器裡面執行程序使用鼠標設置斷點並穿越代碼使用這些調試器的不利方面是並非所有的IDE調試器都支持最新的Java API和技術 (例如servlets 和 EJB 組件)
    基於文本和野蠻的使用編輯器的技術提供更多的控制但是對於沒有太多經驗的程序員可能會花費更長的時間找出錯誤我們稱它們為可憐人的調試方法
    如果上面的都不滿足你的需求 Java平台引入Java Debugging APIs使你可以創建符合你自己特定需求的調試器
    調試類型
    這兒有很多調試方法無論是在客戶端還是服務器端我們在這個材料裡面包含下面的方法:
    基本的Java字節碼 (也就是使用Systemoutprintln())
    使用注釋
    附加在一個正在運行的程序上
    遠程調試
    需求調試(Debugging on demand)
    優化代碼的調試
    Servlet JSP 文件以及EJB 組件的調試
    在後面會詳細說明每一種類型的調試
    共同的錯誤類型
    為了給你一個你將遇到什麼的提示我們在下面列出了開發者一次又一次遇到的編輯或句法錯誤 是你最先和最容易遇到的錯誤它們通常是鍵入錯誤引起的
  邏輯錯誤 不同於運行時錯誤因為沒有任何異常被拋出但是輸出不是期望的東西這些錯誤的范圍從緩沖區溢出到內存洩漏
  運行時錯誤 在程序執行時發生並且通常產生一個Java異常
  線程錯誤 是最難重復和跟蹤的
  Java debugging APIs
    Sun已經定義了調試的結構它們稱之為JBUG這是為了回應對真正的Java調試器的需要做出的這些APIs幫助程序員建立符合自己需要的調試器:
    接口應該和語言的風格一樣是面向對象的
    例如線程和監視器這樣的Java運行時特性應該被前面的支持
    可以進行遠程調試
    在通常操作下的安全性不能被損害
    修正的Java Debugger (JDB) 既是體現Java Debugging API的概念同時又是一個有用的調試工具它用Java Debug Interface (JDI)重寫並且是JDK的一部分 JDB將在後面詳細討論
    准備一個調試用的程序
    Java平台為調試過程提供語言支持
    你在用編譯器編譯你的程序時可以用編譯選項指示編譯器在目標文件中產生符號信息如果你使用其它的編譯器而不是javac參考你的編譯器的文檔獲得如何生成帶有調試信息的目標文件
    如果你使用javac 編譯器創建調試代碼使用g 編譯選項這個選項讓你在調試的時候可以檢查本機類實例和靜態變量如果你沒有使用該選項生成你的類文件你也可以設置斷點和追蹤代碼但是你將不能檢查變量(斷點是手工指定的程序運行停止的點
    即使你使用g選項編譯你的程序也不能調試JAVA平台的核心系統類的局部變量如果你需要列出某些系統類的局部變量的列表你需要使用g選項編譯這些類也就是使用g選項重新編譯rtjar 的類或者是 srczip 裡面的文件然後指定你的 classpath 為正確的類文件使你用新編譯的類運行你的程序在Java 使用 boot classpath 選項使得新類被首先加載
    記住如果你使用 O 選項優化你的代碼你就不能調試你的類優化會將所有的調試信息從類中去掉
    注意: 檢查你的 CLASSPATH 環境變量是正確的才能讓調試器和Java 程序知道在哪兒尋找你的類庫你也應該檢查你的調試工具看是否需要其它的什麼或者是環境變量
    設置斷點
    調試的第一步就是找到代碼出錯的位置斷點設置能幫你完成這個
    斷點是你你放置在程序裡面的臨時標記它使得調試器知道在哪兒停止程序的執行例如如果程序裡面的某個申明引發問題你可以將斷點設置在包含那個申明的行上然後運行程序在那個申明被執行前程序停止執行然後你可以檢查變量寄存器存儲器以及堆棧的內容然後跨過(或執行)那個申明查看問題是怎麼引起的
    不同的調試器支持不同的斷點一些通用的類型是:
    行斷點 在程序特定行的代碼被執行前被引發
    方法斷點 在到達被設置成斷點的方法時被引發
    計數斷點 在某個計數器達到或超過某個特定值時被引發
    異常斷點 在代碼拋出一個特定異常時被引發
    儲存變化斷點 在存儲在特定地址范圍的內容被修改時引發
    地址斷點 在被設置成斷點的地址達到時被引發
    注意: 一些調試器只在編譯版本的Java代碼 (使用justintime 編譯器生成的代碼) 上支持某些斷點類型而不支持解釋代碼(使用javac 工具生成的代碼)一個例子就是地址斷點每個工具在你能設置斷點的方式上可能有些不同檢查你的工具的文檔
    你可能會問我如何知道在哪兒放置斷點?
    如果你對這個問題完全沒有感覺你可以在main() 方法的開始設置斷點
    如果你的代碼產生堆棧復寫(stack trace) 在程序產生它的地方設置斷點你將在堆棧復寫裡面看到源代碼中出問題的行號
    如果你的輸出或者圖形顯示的特定部分沒有正確的顯示預定信息(例如文本域顯示錯誤的文本)你可以在該組件被創建的地方設置斷點然後你可以單步執行你的程序顯示和GUI對象相關的值
    經驗將在最合適的地方設置斷點你在一個類或者程序裡面可以設置多個斷點
    通常你在調試代碼的時候會禁止激活添加刪除斷點工具會允許你查看你所設置的所有斷點的位置同時給你一次刪除所有斷點的選項
    單步執行程序
    單步執行程序是最終解決那些棘手的調試問題的方法它允許你追蹤類裡面的方法體的整個執行過程注意你不需要設置斷點就可以停止一個GUI程序的執行
    設置斷點後在調試器裡面開始執行程序當遇到第一個斷點後你可以越過申明進入方法體或類體也可以繼續運行直到下一個斷點或程序結束
    在調試程序的時候經常遇到的術語有
    進入 執行當前行如果當前行包含一個方法調用執行被調用方法的第一行如果類中的方法是用不帶調試信息的選項編譯的 (也就是沒有使用 g 選項)
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25398.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.