摘要
在本练习中,我们将调试 LinkTree.Java 程序。其实代码并没有错误;然而我们完成调试过程只是为了把握这个过程。
--------------------------------------------------------------------------------
Java调试教程--使用Jikes进行调试(上)
SUN Laura Bennett
启动 JD
在本练习中,我们将调试 LinkTree.java 程序。其实代码并没有错误;然而我们完成调试过程只是为了把握这个过程。
开始调试
首先使用以下命令编译程序:
javac -g LinkTree.java
该命令将执行:
e:jdk1.1.6injava -verbose -nojit
-classpath %JD%;%JDK% jd.Main
-classpath %JD%;%JDK%;%CLASSPATH%
-sourcepath e:jikes %1 %2 %3 %4 %5 %6 %7 %8 %9
调试器启动并装入 LinkTree 类,它包含了 main() 方法,安装它以便调试。可以通过在命令 jd 后的命令行上输入参数(如 URL,用于开始打印页面链接)来传递这些参数。
使用 Console 面板
Console 面板显示了所有运行时异常。所有错误流都打印到这里。当应用程序请求时,您也可以在这里输入输入信息。文本信息都打印到 Console 面板。
在 Source editor 面板中逐行单步调试
让我们开始调试应用程序,使用的方法是逐行单步调试应用程序。从菜单或使用鼠标右键选择 Step Into。步入程序将通知调试器开始执行当前源码。始终从应用程序中的main() 方法开始执行。现在应该看到其它填充了信息的面板。我们将提供关于每个面板的讨论和如何使用每个面板的描述。通过单击窗口的右下方的 Step Over 按钮,逐行单步调试代码。将以白色突出显示当前行。不幸的是,不能在左边看到行号,所以我们将在内容中指出行号。下图中显示了用于单步调试的按钮。假如将鼠标放在任何一个按钮上,将出现一个弹出框,说明该按钮的功能。Stepping into 单步进入方法。Stepping Over 转到同一个方法中的下一个语句。Stepping Out 返回到当前方法的调用程序。Run 按钮一直运行到下一个断点或程序结束。
在 Source editor 面板中设置断点
在某一行代码上单击鼠标左键来设置断点。您将看到在所选择行的左边有一个红色圆圈,当中有一个赞叹号。设置断点时,代码将运行到用断点符号标记的那行。假设您正在尝试观察一段特定代码,而这段代码很深,以至于逐行单步调试需要很长时间。解决方案是在希望程序停止的位置设置断点。
本例中,让我们设置断点来监控 links 的值。假如此时应用程序正在调试器中运行,单击 Stop 按钮以终止执行。应用程序终止后,转至应用程序的源代码并用鼠标左键单击
Vector links = new Vector(); 语句(在以下代码样本中以粗体字显示)。
// Recursive method to list all urls in site
private void listAll( int depth )
{
Vector links = new Vector();
{
printURL( depth );
//links = parseHtmlContainsLinks(getName());
}
if( !((links =
parseHTMLContainsLinks(getName())).isEmpty(
)))
{
//links = parseHTMLContainsLinks(getName());
for( int i = 0; i < links.size(); i++ )
{
if
(!(excludedURLS.contains((String)links.elementAt(
i))))
{
LinksTree child = new
LinksTree((String)links.ele
mentAt(i));
child.listAll( depth + 1 );
}
}
}
}
Source 编辑器窗口将显示带有以下断点的代码。
运行应用程序,并观察它在包含断点的那行停止。可以对代码的运行情况执行更深入的分析。下一屏中,我们将讨论检查变量。请注重,检查了变量之后,可以使用 Run 或Step Into 按钮执行逐行单步调试或继续完整的、不间断的执行。
在 Locals 面板中检查变量设置了断点且应用程序暂停之后,Local 面板将显示所有局部变量引用。以下示例中显示了局部变量在应用程序中当前设置的断点位置的状态。可以看到,显示每个局部变量的同时,还显示其相关的类型和值。
在 Callers 面板中查看调用堆栈调用堆栈是一个列表,它列出了在执行的断点位置之前已经调用或执行过的类。最近调用或执行的方法在堆栈的顶部。从上往下数第二个元素发出了一个调用来执行最顶部的方法,依次类推。在以下示例中,从 main() 方法中调用了 listAll()。
在 Threads 面板中检查线程由于 Java 代码是多线程,因此它必须能够监控个别线程的进程。Threads 显示了当前正在执行的线程的状态。在我们的代码中,只有一个线程。在更复杂的应用程序中,可能会看到在 thread 面板中列出了多个线程。
在 Classes 面板中查看已装入的类Classes 面板中列出了在执行程序时装入的类。选择那些类中的任何一个以在 Source 面板中查看代码。请记住,假如没有使用 -g 选项来编译类,就无法查看源码。
完成实例研究
您已经了解如何有效使用 Jikes 调试设施来追捕和查明错误。我们使用相当简单的示例来演示了调试器。我们建议使用更复杂的 Applet 或应用程序来增加您使用调试器的经验。
请记住,Jikes是一个开放源码调试器,所以我们希望您更新并增强它。最后,但也是相当重要的,请与开发者社区共享您的更改