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

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

Java調(diào)試教程--基礎(chǔ)知識概述

2019-11-18 14:24:40
字體:
供稿:網(wǎng)友

  摘要

  java 平臺提供了用于調(diào)試處理的語言支持。可以用某些編譯器選項來編譯程序,這些編譯器選項指導(dǎo)編譯器在目標(biāo)文件中生成符號化信息。假如所使用的編譯器不是javac,請參考編譯器文檔以了解如何使用調(diào)試信息來編譯程序。



--------------------------------------------------------------------------------


  Java調(diào)試教程--基礎(chǔ)知識概述

  SUN Laura Bennett

  預(yù)備要調(diào)試的程序

  Java 平臺提供了用于調(diào)試處理的語言支持。可以用某些編譯器選項來編譯程序,這些編譯器選項指導(dǎo)編譯器在目標(biāo)文件中生成符號化信息。假如所使用的編譯器不是javac,請參考編譯器文檔以了解如何使用調(diào)試信息來編譯程序。

  假如使用 javac 編譯器來構(gòu)建要調(diào)試的代碼,請使用 -g 編譯器選項。該選項讓您可以在調(diào)試時檢查局部、類實例和靜態(tài)變量。假如不使用 -g 選項來編譯類,依然可以設(shè)置斷點并單步調(diào)試代碼;但是將不能檢查變量。(斷點是在代碼中手工指定的希望停止執(zhí)行程序的位置。)

  即便使用 -g 選項來編譯應(yīng)用程序,在核心 Java 平臺系統(tǒng)類中仍不能使用本地調(diào)試值。假如需要列出某些系統(tǒng)類的列表局部變量,需要使用 -g 選項來編譯那些類。使用-g 選項來重新編譯 rt.jar 或 src.zip 文件中的類。將類路徑指向正確的類文件,以便使用新編譯的對話類來運行應(yīng)用程序。在 Java 2 中,使用 boot classpath 選項,這樣?請記住,假如使用用于優(yōu)化代碼的 -O 選項進行編譯,那么將無法調(diào)試類。優(yōu)化將除去類中的所有調(diào)試信息。

  注:驗證是否正確設(shè)置了 CLASSPATH 環(huán)境變量,以便調(diào)試器和 Java 應(yīng)用程序知道在哪里可以找到類庫。還應(yīng)該檢查正在使用的工具,查看是否還有其它必需或可選的環(huán)境變量。

  設(shè)置斷點

  調(diào)試的第一步是找出代碼的哪個位置出了錯。設(shè)置斷點有助于完成此項工作。斷點是放置在程序中的臨時標(biāo)記,用于告訴調(diào)試器在何處停止執(zhí)行程序。例如,假如程序中的某個特定語句造成了問題,可以在包含該語句的那行中設(shè)置斷點,然后運行程序。在執(zhí)行該語句之前,將在斷點處停止執(zhí)行。然后可以檢查變量、寄存器、存儲器和堆棧的內(nèi)容,然后跨過(或執(zhí)行)該語句來查看問題是如何產(chǎn)生的。許多調(diào)試器都支持幾種斷點。某些最常用的斷點是:

  行斷點,在執(zhí)行程序中某特定行的代碼之前觸發(fā)。

  方法斷點,在到達已設(shè)置了斷點的方法時觸發(fā)。

  計數(shù)器斷點,在計數(shù)器假設(shè)或超過某個特定值時觸發(fā)。

  異常斷點,在代碼拋出特定類型的異常時觸發(fā)。

  存儲器更改斷點,在更改了某特定存儲器地址范圍中的存儲器時觸發(fā)。

  地址斷點,在到達設(shè)置了斷點的地址處觸發(fā)。

  注:某些調(diào)試器只支持編譯型 Java 代碼(如 JIT 編譯器)中某些類型的斷點,而不支持解釋型代碼(如由 javac 工具編譯的代碼)中的斷點。“地址斷點”就是這樣的例子。每種工具設(shè)置斷點的方法都略有不同。請查看工具的文檔。

  您也許會問,我怎么知道在哪里放置斷點呢?

  假如您對此問題仍感到不知所措,那么可以在 main() 方法中的程序開始處設(shè)置斷點。

  假如代碼生成了堆棧跟蹤,那么在堆棧跟蹤結(jié)束的區(qū)域中設(shè)置斷點。可以在堆棧跟蹤中看到源代碼的行號。

  假如輸出或圖形顯示的特定部分沒有正確顯示信息(例如,文本字段顯示了錯誤的文本),可以在創(chuàng)建組件的位置設(shè)置斷點。然后可以單步調(diào)試代碼,并顯示分配給 GUI 對象的值。

  經(jīng)驗會教您如何在最適當(dāng)?shù)奈恢迷O(shè)置斷點。在一個類或程序中可以設(shè)置多個斷點。在調(diào)試代碼時,通常會禁用或啟用斷點,或者添加或刪除斷點。工具可以讓您查看所有斷點的位置,并可以在一步操作中刪除所有斷點。

  單步調(diào)試程序

  單步調(diào)試程序就是解決這些棘手的調(diào)試問題的基本方法。它讓您可以運行在類主體中調(diào)用的方法。請注重,不必設(shè)置斷點就可以停止圖形用戶界面 (GUI) 程序。在設(shè)置了斷點之后,開始在調(diào)試器中執(zhí)行代碼。碰到第一個斷點時,可以跨過語句,步入其它方法或類,繼續(xù)運行直至到達下一個斷點,或者繼續(xù)運行直到程序結(jié)束。步入調(diào)試器時,會看到的常見項是:

  Stepping into 執(zhí)行當(dāng)前行。假如當(dāng)前行包含對某個方法的調(diào)用,則執(zhí)行轉(zhuǎn)到被調(diào)用方法的第一行。假如方法在未用調(diào)試信息編譯(即,用 -g 選項)的類中,則會看到一條消?

  Stepping over 執(zhí)行當(dāng)前行,但不會在該行中調(diào)用的任何函數(shù)或例程中停止。

  Step return 從當(dāng)前執(zhí)行點一直執(zhí)行到調(diào)用當(dāng)前方法的那行代碼的后面一行。

  檢查變量

  通常,程序會因為沒有正確設(shè)置變量的值而發(fā)生信息轉(zhuǎn)儲。最常見的情況是試圖將變量與空值比較或?qū)ψ兞砍粤恪U页鍪欠翊嬖谶@種情況的最簡便方法是在發(fā)生錯誤的位置檢查值。通常,不會在您期望的位置對變量進行賦值。

  可視調(diào)試器通常有一個監(jiān)控窗口,在該窗口中顯示了當(dāng)前所在的類中所有局部變量的值。某些調(diào)試器甚至顯示變量的地址,甚至還讓您動態(tài)更改變量值以查看程序是否按您的最初設(shè)想繼續(xù)執(zhí)行。命令行調(diào)試器通常通過命令來處理相同功能。使用命令行功能,甚至可以通過顯示每一行和每一列的內(nèi)容來檢查數(shù)組的全部內(nèi)容。

  雖然大多數(shù)調(diào)試器只在監(jiān)控窗口中顯示類作用域中的局部變量,但有些調(diào)試器讓您可以在它離開作用域之后繼續(xù)監(jiān)控變量。某些調(diào)試器支持查看寄存器。請注重,只能在編譯型 Java 程序中查看寄存器,在解釋型程序卻不行。

  堆棧跟蹤

  當(dāng) Java 程序轉(zhuǎn)儲信息時,它會生成控制臺窗口的堆棧跟蹤。堆棧跟蹤告訴開發(fā)人員程序執(zhí)行到發(fā)生問題的位置經(jīng)過的確切路線。堆棧跟蹤將指出類和方法名稱,以及源代碼行號(假如使用調(diào)試選項進行編譯)。假如從跟蹤的起點開始,可以向回追溯代碼,以查看究竟執(zhí)行了什么語句。這是一種迅速確定程序中哪里出錯的方法。

  可以使用以下語句人為地生成堆棧跟蹤。

  Throwable().PRintStackTrace() 用于在某一時刻生成方法代碼的跟蹤。此跟蹤將顯示線程之間的方法調(diào)用。

  Thread.currentThread.dumpStack() 用于只生成當(dāng)前線程的快照。

  假如需要了解程序在什么情況下會生成輸出,就應(yīng)該實施堆棧跟蹤。以下是實施堆棧跟蹤的一個示例。此代碼段方法創(chuàng)建了文件的副本。我們通過比較兩個文件的長度來檢查復(fù)制是否成功。假如不相等,我們將對一個建立跟蹤,然后打印堆棧跟蹤(見以粗體字顯示的語句)。Throwable() 是 java.lang 包中的一個類。printStackTrace() 是 Throwable() 類中的一個方法,它將打印出程序執(zhí)行路線的跟蹤。


public 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(ol
dFileLength));
Debug.trace(1, targetFile + Constants.BLANK_STRING +
Long.toString(ne
wFileLength));
Throwable().printStackTrace();
return false;
}
}
else
{
Debug.trace(1, sourceFile);
Debug.trace(1, targetFile);
return false;
}
........
........
return true;
}

  您可能會發(fā)現(xiàn)堆棧跟蹤沒有打印行號。這就是所謂的“編譯代碼”。要獲取行號,使用 nojit 選項或命令行自變量 Djava.compiler=NONE 來禁用 JIT 編譯器。但是,假如得到了方法的名稱以及它所屬的類,獲取行號就不那么重要了。

  診斷方法

  Java 語言提供了 Runtime() 類中的方法,用于跟蹤對 Java 虛擬機的調(diào)用。這些跟蹤將生成一個列表,它包含程序?qū)?JVM 字節(jié)碼的每一個方法調(diào)用。請注重,該列表可能會生成大量輸出,所以每次使用它時應(yīng)針對小段代碼。將以下行添加到源代碼中,以打開跟蹤:

traceMethodCalls(true)

  將以下行添加到源代碼中,以關(guān)閉跟蹤:

traceMethodCalls(false)

  啟動 JVM,當(dāng)它被發(fā)送到標(biāo)準(zhǔn)輸出時,監(jiān)視輸出。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳泉市| 钟祥市| 桐柏县| 苗栗市| 南充市| 平潭县| 平南县| 崇州市| 那坡县| 奉化市| 开阳县| 平江县| 双桥区| 固始县| 达拉特旗| 东兰县| 浪卡子县| 虞城县| 黔西| 淮安市| 德江县| 闵行区| 昭通市| 平江县| 涿鹿县| 武宁县| 安丘市| 辛集市| 永川市| 敖汉旗| 丹寨县| 宿松县| 东明县| 曲麻莱县| 手游| 太和县| 清水河县| 六盘水市| 贡觉县| 泰和县| 苗栗县|