?? debug.html
字號(hào):
<!-- saved from url=(0022)http://internet.e-mail -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta name="generator" content="Microsoft FrontPage 4.0">
<title>Building Applications: Debugging Java programs</title>
<meta name="Author" content="kt">
<link type="text/css" href="../jbdocs.css" rel="stylesheet">
</head>
<body bgcolor="#fefef2" style="FONT-SIZE: 9pt">
<a name="using_the_debugger"></a>
<STRONG><FONT color=#0080FF size=3 >調(diào)試 Java 程序</font></strong>
<hr>
譯者名字: zdx_nari(JD001)<br>
郵件地址:<A href="mailto:zdx_nari@hotmail.com">zdx_nari@hotmail.com</A>
<p>調(diào)試就是在你的程序中定位和修改錯(cuò)誤的過程。JBuilder的集成調(diào)試器使你能在JBuilder的環(huán)境中進(jìn)行調(diào)試。 通過<a href="../ui/menus/mrun.html">Run</a>菜單條可以訪問調(diào)試器的許多功能部件。你也可以在編輯器或在調(diào)試器中使用右擊菜單來訪問調(diào)試器的功能部件。</p>
<p>當(dāng)調(diào)試器暫停你的程序,你可以察看程序數(shù)據(jù)項(xiàng)的當(dāng)前值。在調(diào)試期間修改數(shù)據(jù)值提供了在程序運(yùn)行時(shí),檢驗(yàn)假想錯(cuò)誤(bug)的方法。</p>
<p> 調(diào)試指南,請(qǐng)參閱 <a href="../tutorials/debug/dbtutorial.html">"編譯, 運(yùn)行 和 調(diào)試."</a></p>
<p> 其余的信息和技巧可以在以下特定的調(diào)試主題中得到:</p>
<ul>
<li> 如果你的程序使用了<code>JDataStore</code>組件,請(qǐng)參閱 <cite>JDataStore Programmer's Guide</cite> 的<a href="../datastore/trouble.html">"Troubleshooting"</a> 章節(jié)。 <span class="bsku">(JBuilder Professional and Enterprise)</span></li>
<li> 如果你正在調(diào)試一個(gè)分布式應(yīng)用程序,請(qǐng)參閱 <cite>Distributed Application Developer's Guide</cite>的 <a href="../distributed/distdebugging.html">"Debugging distributed applications" </a>章節(jié)。<span class="bsku">(JBuilder Enterprise)</span></li>
</ul>
<!--************************************************************--><a name="types_of_errors"></a>
<hr>
<p><font size="3" color="#000080"><b>錯(cuò)誤類型</b></font></p>
<!--BNDX="errors:types of"-->
<p>調(diào)試器可以幫助找到運(yùn)行器錯(cuò)誤和邏輯錯(cuò)誤。如果你找到或懷疑一個(gè)程序運(yùn)行或邏輯錯(cuò)誤,你可以通過在調(diào)試器的控制下運(yùn)行你的程序從而開始一次調(diào)試過程(session)。 </p>
<a name="run-time_errors"></a>
<p><b><font color="#000080" size="2">Runtime errors</font></b></p>
<!--BNDX="runtime:errors;runtime:exceptions;debugging:runtime exceptions"-->
<p>如果你的程序調(diào)試通過了,但當(dāng)你運(yùn)行它時(shí)卻給出違例或懸掛(hang),你遇到了一個(gè)運(yùn)行時(shí)錯(cuò)誤。你的程序包含了有效的聲明,但這些聲明在它們被執(zhí)行時(shí)導(dǎo)致了錯(cuò)誤。例如,你的程序試著打開一個(gè)不存在的文件,或者使一個(gè)數(shù)字被零除。</p>
<p>沒有調(diào)試器,運(yùn)行時(shí)錯(cuò)誤很難被定位,因?yàn)榫幾g器并沒有告訴你它們的任何情況。經(jīng)常,你可以使用的唯一線索就是程序運(yùn)行的結(jié)果,例如屏幕的外形以及由運(yùn)行時(shí)間錯(cuò)誤產(chǎn)生的錯(cuò)誤消息。</p>
<p>盡管你可以通過搜索你的程序源代碼找到運(yùn)行時(shí)間錯(cuò)誤,但調(diào)試器可以幫助你快速地捕捉到這些錯(cuò)誤類型。使用調(diào)試器,你可以運(yùn)行到一特定的程序位置。在那兒,你可以一次一個(gè)聲明(one statement at a time)地執(zhí)行你的程序,觀察你程序每一步的行為。在那兒,你可以修改源代碼,重新編譯程序,繼續(xù)測(cè)試你的程序。</p>
<p>如果你的程序拋出了一個(gè)運(yùn)行時(shí)間錯(cuò)誤,將在<a href="#console_view">Console output, input, and errors view</a>打印一個(gè)堆跡(stack trace)。你可以雙擊堆跡的一行,來到對(duì)應(yīng)的源文件中的那行代碼。</p>
<p>在下面的例子中,一字符串("<kbd>eeee</kbd>")替代一個(gè)數(shù)字進(jìn)入一個(gè)輸入域。<code>NumberFormatException</code> 違例將被拋出。<code>FloatingDecimal.java</code>的源代碼在編譯器中顯示;這是被拋出違例其所在的類。</p>
<p class="bfig">編譯器中的運(yùn)行時(shí)錯(cuò)誤</p>
<p><img border="0" src="images/db_runtime_error.gif" width="602" height="490"> <!--************************************************************-->
</p>
<a name="logic_errors"></a>
<p><font size="2" color="#000080"><b>邏輯錯(cuò)誤</b></font></p>
<!--BNDX="logic errors;debugging:logic errors"-->
<p>邏輯錯(cuò)誤是在你程序的設(shè)計(jì)和實(shí)現(xiàn)時(shí)所發(fā)生的錯(cuò)誤。你程序的聲明是有效的(它們執(zhí)行有結(jié)果),但它們執(zhí)行的行為并不是你寫代碼時(shí)你想象中的行為。例如,當(dāng)變量包含了不正確的值,圖像看起來不正確,或者當(dāng)程序的輸出不正確,就可能發(fā)生邏輯錯(cuò)誤。</p>
<p> 邏輯錯(cuò)誤經(jīng)常是最難發(fā)現(xiàn)的錯(cuò)誤類型,因?yàn)樗鼈冊(cè)谀阆氩坏降牡胤匠霈F(xiàn)。為了確信你的程序是按照設(shè)計(jì)要求而工作的,你需要徹底測(cè)試程序的所有方面。只有通過細(xì)察用戶接口和程序輸出的每一部分,你才能確信程序的行為與它的設(shè)計(jì)是一致的。和運(yùn)行時(shí)間錯(cuò)誤一樣,調(diào)試器幫助你在程序執(zhí)行時(shí)監(jiān)視你程序變量和數(shù)據(jù)對(duì)象的值,從而定位邏輯錯(cuò)誤。</p>
<p>
<a name="overview_of_the_debugging_process"></a>
</p>
<hr>
<p><font size="3" color="#000080"><b>調(diào)試過程概覽</b></font></p>
<!--BNDX="debugging:overview"-->
<p>程序設(shè)計(jì)后,程序編碼和調(diào)試的不斷循環(huán)組成了程序開發(fā)。只有在你徹底的測(cè)試了你的程序后,你才成發(fā)布你它。為了確信你測(cè)試了程序的所有方面,最好是有一個(gè)全面的測(cè)試和調(diào)試計(jì)劃。</p>
<p>
一個(gè)好的調(diào)試方法包括了把你的程序分解成幾個(gè)可以系統(tǒng)調(diào)試的不同片斷(section)。通過緊密監(jiān)視每一程序片斷的聲明,可以證實(shí)每一部分是按照設(shè)計(jì)來執(zhí)行的。如果你發(fā)現(xiàn)了一個(gè)程序錯(cuò)誤,你可以在一的源代碼中改正這個(gè)問題,重新編譯程序并繼續(xù)測(cè)試。</p>
<p><span class="bscan">注意:</span> 你可以用支持JPDA debugging API的任何JDK進(jìn)行調(diào)試。通常,你將用JBuilder裝載的JDK版本進(jìn)行調(diào)試。<a name="compiling_with_debug_info"></a></p>
<p><font color="#000080" size="2"><b>用符號(hào)化調(diào)試信息編譯工程</b></font></p>
<!--BNDX="compiling:programs with debug info;debugging:compiling with debug info;debug information:"-->
<p>當(dāng)你開始一次調(diào)試過程時(shí),你需要用符號(hào)化調(diào)試信息編譯你的工程。符號(hào)化調(diào)試信息使調(diào)試器在你的程序源代碼和編譯器產(chǎn)生的Java 字節(jié)碼之間進(jìn)行連接。</p>
<p>默認(rèn)情況時(shí),JBuilder在你編譯時(shí)包括符號(hào)化調(diào)試信息。為了確信當(dāng)前工程設(shè)置了這個(gè)選項(xiàng),</p>
<ol>
<li>選擇 Project|Project Properties,打開工程屬性對(duì)話框。</li>
<li>選擇 Build 標(biāo)簽</li>
<li>檢查這些調(diào)試選項(xiàng)的一種:
<ul>
<li>Source , Line and Variable Information: 當(dāng)你編譯,構(gòu)造,或者重建一個(gè)節(jié)點(diǎn)時(shí),包含了在<code>.class</code>文件中的源名,行數(shù)以及當(dāng)?shù)刈兞啃畔⒌恼{(diào)試信息。</li>
<li>Source And Line Only: 當(dāng)你編譯,構(gòu)造,或者重建一個(gè)節(jié)點(diǎn)時(shí),僅包含了在<code>.class</code>文件中的源名,行數(shù)的調(diào)試信息。</li>
<li>Source Only: 當(dāng)你編譯,構(gòu)造,或者重建一個(gè)節(jié)點(diǎn)時(shí),僅包含了在<code>.class</code>文件中的源名的調(diào)試信息。</li>
</ul>
</li>
</ol>
<p>為了給所有新的工程設(shè)置這個(gè)選項(xiàng),選擇 Project|Default Project Properties,然后在 Build 頁選擇位于第一的三個(gè)調(diào)試選項(xiàng)的一種。(設(shè)置默認(rèn)的工程屬性并不影響已存在的工程。)</p>
<p> 如果你選擇了不包括任何調(diào)試信息的 None 選項(xiàng),你仍可以進(jìn)行調(diào)試。沒有調(diào)試信息,<kbd>this</kbd>對(duì)象仍可以用來調(diào)試。通過選擇這個(gè)選項(xiàng),你可以顯著地把類的尺寸減為最小。</p>
<p><span class="bscan">注意:</span> 你不能在Java API 類中看到變量信息,因?yàn)樗鼈兙幾g時(shí)僅有源名和行數(shù)信息。然而,你可以跟蹤進(jìn)類里。學(xué)習(xí)怎樣跟蹤進(jìn)類里,請(qǐng)參閱 <a href="debug2.html">"Controlling which classes to trace into."</a> </p>
<p>當(dāng)你產(chǎn)生符號(hào)化的調(diào)試信息,編譯器把這些信息存入相關(guān)的<code>.class</code>文件中。這就使得<code>.class</code>文件比不帶調(diào)試信息而編譯的文件大許多。你可以在部署前把這個(gè)選項(xiàng)關(guān)掉。</p>
<p>為了在調(diào)試前自動(dòng)進(jìn)行編譯,在 Project Properties 對(duì)話框 Run 頁中選中 Compile Before Debugging 選項(xiàng)。 這個(gè)選項(xiàng)可以用來在調(diào)試器的控制下在你的工程運(yùn)行前自動(dòng)的編譯它。如果不選中這個(gè)選項(xiàng),JBuilder將在調(diào)試你的工程前不編譯它,所以你的源文件和類文件會(huì)失去同步。如果這個(gè)選項(xiàng)被關(guān)了,先使用 Project|Make 命令。</p>
<a name="starting_debugger"></a>
<p><font color="#000080" size="2"><b>啟動(dòng)調(diào)試器</b></font></p>
<!--BNDX="debugging:starting;starting:the debugger"-->
<p>一旦在編譯你的工程時(shí)包含了調(diào)試信息,你可以用以下的菜單項(xiàng)來啟動(dòng)調(diào)試器。</p>
<p class="btbl">啟動(dòng)調(diào)試器的菜單命令</p>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th style="background-color: #000080"><font color="#FFFFFF" size="2">命令</font></th>
<th style="background-color: #000080"><font color="#FFFFFF" size="2">快捷鍵</font></th>
<th style="background-color: #000080"><font color="#FFFFFF" size="2">描述</font></th>
</tr>
<tr>
<td><font size="2">Run|Debug Project</font></td>
<td><font size="2"><kbd>Shift + F9</kbd> or  <img src="images/toolbardebug.gif" align="top"></font></td>
<td><font size="2">在調(diào)試器里啟動(dòng)程序,在一個(gè)斷點(diǎn)或首先需要用戶輸入的第一行代碼前暫停執(zhí)行。</font></td>
</tr>
<tr>
<td><font size="2">Run|Step Over</font></td>
<td><kbd><font size="2">F8</font></kbd></td>
<td><font size="2">在可執(zhí)行代碼的第一行暫停執(zhí)行</font></td>
</tr>
<tr>
<td><font size="2">Run|Step Into</font></td>
<td><kbd><font size="2">F7</font></kbd></td>
<td><font size="2">在可執(zhí)行代碼的第一行暫停執(zhí)行</font></td>
</tr>
</table>
<p>如果你還沒為你的程序選擇 main 類,Project Properties 對(duì)話框的 Run 頁在調(diào)試過程開始前將被顯示。對(duì)于程序來說,選擇包含<code>main()</code>方法的類。對(duì)于小應(yīng)用程序來說,選擇包含<code>init()</code>方法的類或小應(yīng)用程序的 HTML 文件。 </p>
<p>在你的工程中要調(diào)試一個(gè)特定的類,而不是整個(gè)工程,在瀏覽窗中選中這個(gè)文件,右擊并選中 Debug。</p>
<p> 每次當(dāng)你啟動(dòng)調(diào)試器時(shí),你就啟動(dòng)了一次調(diào)試過程。更多信息,參閱 <a href="#debugging_session">"Debugging sessions."</a></p>
<p><span class="bscan">注意:</span> 為一次調(diào)試過程選擇一個(gè)調(diào)試配置,點(diǎn)擊主菜單欄中的 Debug Projec 圖標(biāo)右邊的向下箭頭。關(guān)于調(diào)試配置的更多信息,參閱 <a href="debug5.html">"Creating debugger configurations."</a><a name="run_under_debugger"></a> </p>
<p><font color="#000080" size="2"><b>在調(diào)試器的控制下運(yùn)行</b></font></p>
<!--BNDX="debugger:running under control of;running:under debugger control"-->
<p>當(dāng)你在在調(diào)試器的控制下運(yùn)行你的程序,程序的行為和通常的一樣---你的程序創(chuàng)建窗口,接受用戶輸入以及顯示輸出。調(diào)試器可以中斷的程序,允許你使用調(diào)試器的視圖來檢查程序的當(dāng)前狀態(tài)。通過觀察變量值,調(diào)用棧上的方法以及程序輸出,你可以確信你正在檢查的代碼區(qū)執(zhí)行起來就像它被設(shè)計(jì)的那樣。</p>
<p> 當(dāng)你在在調(diào)試器的控制下運(yùn)行你的程序時(shí),你可以看到你程序在其創(chuàng)建的窗口中的行為。當(dāng)你調(diào)試時(shí),放置好窗口從而你可以同時(shí)看到調(diào)試器和你的應(yīng)用程序窗口。當(dāng)焦點(diǎn)在調(diào)試器視圖和你的應(yīng)用程序間相互轉(zhuǎn)換時(shí),為了防止窗口的閃爍,排列窗口使它們不重疊。</p>
<a name="pause_program_execution"></a>
<p><font size="2" color="#000080"><b>中斷程序執(zhí)行</b></font></p>
<!--BNDX="debugging:pausing program execution;pausing program execution"-->
<p>當(dāng)你在使用調(diào)試器時(shí),你的程序處于兩種可能的狀態(tài)之一:<em>運(yùn)行</em> 或者 <em>暫停</em></p>
<ul>
<li>當(dāng)調(diào)試器工具欄的 Pause 圖標(biāo)<img border="0" src="images/db_toolbar_pause.gif">處于可用狀態(tài),你的程序正在運(yùn)行。</li>
<li>當(dāng)你點(diǎn)擊 Pause 圖標(biāo),你的程序就被中斷。當(dāng)你的程序被中斷,你可以檢查數(shù)據(jù)值。調(diào)試器工具欄的步進(jìn)(stepping)圖標(biāo)變得可用。碰到一個(gè)斷點(diǎn)或由步進(jìn)而停止也可以中斷執(zhí)行。</li>
</ul>
<p>為了恢復(fù)程序的執(zhí)行,選中調(diào)試器工具欄的 Resume Program 圖標(biāo)  <img border="0" src="images/db_toolbar_resume.gif"> 。當(dāng)調(diào)試過程結(jié)束,這個(gè)圖標(biāo)變?yōu)?Restart Program 圖標(biāo) <img src="images/toolbardebug.gif" align="top">  ,并重新開始調(diào)試過程。</p>
<a name="end_debugging_session"></a>
<p><font color="#000080" size="2"><b>結(jié)束調(diào)試過程</b></font></p>
<!--BNDX="debugging:ending session;ending debugging session"-->
<p>為了結(jié)束當(dāng)前的調(diào)試過程并釋放程序占用的資源,選中 Reset Program 圖標(biāo) <img src="images/db_toolbar_reset.gif" align="top">。</p>
<p>你也可以退出程序而關(guān)閉調(diào)試過程。若要移掉調(diào)試欄,右擊調(diào)試欄并選中 Remove。</p>
<hr>
<br>
<a name="debugger_ui"></a>
<p><font color="#000080" size="3"><b>調(diào)試器用戶界面</b></font></p>
<!--BNDX="debugger:user interface"-->
<p>如果工程或類編譯成功,調(diào)試器就在 AppBrowser 的底部顯示出來。 </p>
<ul>
<li>在 AppBrowser 的底部的水平標(biāo)簽代表了 <a href="#debugging_session">調(diào)試過程(debugging sessions)。</a></li>每一個(gè)標(biāo)簽代表了一個(gè)新的過程。
<li>在 AppBrowser 左面較底部分的垂直標(biāo)簽代表了 <a href="#debugger_views">調(diào)試器視圖(debugger views)。</a></li>試圖顯示了當(dāng)前被選的調(diào)試過程。每個(gè)試圖顯示了圖標(biāo),用來指出在視圖中的被選的每一項(xiàng)的狀態(tài)和類型。
<li><a href="#debugger_toolbar">調(diào)試器工具欄</a> 用來顯示當(dāng)前被選的調(diào)試過程。</li>
</ul>
<p class="bfig">調(diào)試器用戶界面</p>
<p><img border="0" src="images/db_in_appbrowser_overview.gif" width="630" height="546"> </p>
<a name="debugging_session"></a>
<p><font color="#000080" size="2"><b>調(diào)試過程</b></font></p>
<!--BNDX="debugging:sessions"-->
<p>調(diào)試器允許你在多個(gè)調(diào)試過程中調(diào)試多個(gè)進(jìn)程。多個(gè)進(jìn)程可以在同一個(gè) JBuilder 工程中,或在不同的工程中。這就允許在同一個(gè) JBuilder 實(shí)例中,同一時(shí)刻,同時(shí)調(diào)試客戶端和服務(wù)器端進(jìn)程。 </p>
<p>在每個(gè)單獨(dú)的工程中存儲(chǔ)了跟蹤關(guān)閉的觀察點(diǎn)(watches),斷點(diǎn)和類。在一個(gè)工程中,所有的斷點(diǎn)和觀察點(diǎn)應(yīng)用到了所有的進(jìn)程中。可以為一個(gè)運(yùn)行時(shí)配置有選擇地關(guān)閉斷點(diǎn)。
<p>當(dāng)你在 Run 菜單條使用除了Run Project, Debug Project 和 Configurations 外的命令時(shí),你仍在被選的調(diào)試過程中。當(dāng)你使用調(diào)試器工具郎中的圖標(biāo)時(shí),你同樣仍在被選的調(diào)試過程中。Configurations </p>
<p>為了結(jié)束當(dāng)前的調(diào)試過程并釋放程序占用的資源,選中 Reset Program 圖標(biāo) <img border="0" src="images/db_toolbar_reset.gif">。你也可以通過右擊調(diào)試過程標(biāo)簽并選中 Remove Tab 來退出程序。盡管在標(biāo)簽被移走前你將快速地結(jié)束進(jìn)程,但首先使用 Run|Rest Program 是個(gè)好主意。</p>
<a name="debugger_views"></a>
<p><b><font size="2" color="#000080">調(diào)試器視圖</font></b></p>
<!--BNDX="debugger:views"-->
<p>調(diào)試器視圖允許你看到你程序的內(nèi)部及看到下一步將發(fā)生什么。你使用調(diào)試器視圖來檢查和改變數(shù)據(jù)值,在你的程序中向前和向后跟蹤,檢查一個(gè)方法的內(nèi)部處理過程和那個(gè)方法的調(diào)用,在你的程序中跟隨一個(gè)獨(dú)立的線程。</p>
<p>調(diào)試器視圖在 AppBrowser 的底部顯示。選中在調(diào)試器左邊的標(biāo)簽從而選擇某個(gè)視圖。視圖(除了 Console output, input, and errors 視圖)也可以作為浮動(dòng)窗口而顯示。浮動(dòng)窗口允許你在同一時(shí)間看見多個(gè)調(diào)試器視圖,而不是不得不在視圖間前后切換。 <span class="bsku">(浮動(dòng)窗口是 JBuilder Professional and Enterprise 的一項(xiàng)屬性)</span></p>
<ul>
<li>要使一個(gè)視圖作為一個(gè)浮動(dòng)窗口顯示,右擊這個(gè)視圖的空白區(qū)域,然后選擇 Floating Window 。 </li>
<li>要關(guān)閉浮動(dòng)窗口,點(diǎn)擊浮動(dòng)窗口的 Close(關(guān)閉) 按鈕或者右擊這個(gè)視圖的空白區(qū)域并除去 Floating Window 選擇。</li>
<li>在你關(guān)閉了浮動(dòng)窗口后,要恢復(fù)默認(rèn)的視圖順序,右擊視圖的空白區(qū)域,然后選中 Restore Default View Order。</li>
</ul>
<p>調(diào)試器視圖也有右擊菜單。這些菜單的命令經(jīng)常同那些在 Run 或 View 菜單里的命令是重復(fù)的,這樣就使你可以容易地控制調(diào)試器。</p>
<p>另外,每一個(gè)調(diào)試器的視圖顯示了不同的圖標(biāo)來指明所選項(xiàng)的狀態(tài)。例如,一個(gè)斷點(diǎn)可以被禁止(disabled),檢驗(yàn)(verified),未檢驗(yàn)(unverified),或者是無效的(invalid) - 每一個(gè)狀態(tài)用視圖左邊緣的一個(gè)小圖標(biāo)來可視化的指明。</p>
<p>調(diào)試器的視圖,圖標(biāo)以及右擊菜單在下面描述。</p>
<a name="console_view"></a>
<p><font color="#000080" size="2"><b>Console output, input, and errors 視圖</b></font></p>
<!--BNDX="debugger:Console output, input, and errors view;Console output, input, and errors view"-->
<p>Console output, input, and errors 視圖 <img src="images/dbconsole.gif" border="0" align="bottom"> 顯示程序的輸出以及程序內(nèi)的錯(cuò)誤。它也允許你輸入程序所需的任何輸入。如果程序有任何的輸出或任何的錯(cuò)誤消息被顯示出來,那么圖標(biāo)上的圖像就發(fā)生變化。</p>
<p>運(yùn)行時(shí)間違例在這個(gè)視圖中顯示。</p>
<p class="btbl">Console output, input, and errors 視圖中的圖標(biāo)</p>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th style="background-color: #000080"><font color="#FFFFFF" size="2">圖標(biāo)</font></th>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -