2001 年,IBM 为开放源代码社区引入了 Eclipse 平台,以努力使其产品的工具对第三方产品更加开放,同时也努力对平台进行总体上的加强。作为这个战略的一部分,IBM 现在提供了一套新工具,用来构建基于 Eclipse 平台的企业 Java™ 应用程序。这套新工具称为 WebSphere™Studio Application Developer,它集成了一个基于 Java 的调试器来作为它自己的调试器。
这给我们带来了很大的好处,因为我们不必再使用两个调试器。VisualAge™forJava 由一个在 VisualAge for Java 内进行调试的内部调试器和一个用于调试远程服务器的 IBM 远程调试器(IBM Remote Debugger)组成。现在我们可以使用一个调试器,它可以满足您的全部需要,并且具有 IBM 一贯提供的丰富的功能。
我们打算在两篇文章中向您介绍这个调试器。我们假设读者熟练掌握了 J2EE、WebSphere Studio Application Developer 开发和部署的基础知识。
在这篇文章中,我们通过在 WebSphere Studio Application Developer 内使用 EJB、Servlet 和 JSPs™,向您介绍如何使用这个调试器及其某些基本/集成功能来调试 Java 应用程序。我们将采取一种实际操作的办法介绍一个简单的 Web 应用程序,这个应用程序存在几个相互嵌套的问题(一个问题在 JSP 代码中,一个问题在 Servlet 代码中,还有一个问题在 EJB 代码中),我们将使用这个调试器发现和修正全部三个问题。
在第2 部分中,我们将说明,把应用程序部署到 WebSphere Application Server,高级版(Advanced Edition(AE))之后,如何使用 WebSphere Studio Application Developer 来调试它。
从这里可下载文件DebugInWSADpt1.zip ,包含有本文所描述的类和归档。
调试一个简单的 Java 应用程序
在调试器中启动您的应用程序
- 切换到(或打开)一个 Java 透视图。
- 创建一个新的 Java 工程并将之称为 TestDebug。
- 将样本 Java 应用程序
testdebug.jar 文件导入到 TestDebug 工程。
- 请检查
poc.debug.app.AppDebug.java 。它是一个简单的应用程序,我们将用它来演示调试器的基础知识。
- 插入一个断点到 main 方法中的循环内的以下语句:
x = y + z;
要这样做,您可以双击源代码的左窗格,或使用弹出菜单,如下面的图 1 所示。
-
图 1. 向源代码添加断点
- 在工具栏中,单击 Debug(
)按钮。您将看到一个对话框,询问您想使用哪一个启动程序。选择 Java Application,选中 Set as default launcher...复选框,然后单击 Next。
运行应用程序的另一个按钮是 Run(
)按钮。这个按钮在非调试 Java JVM 中运行应用程序,这种 JVM 的执行速度更快,但不允许调试或使用断点。这是 WebSphere Studio ApplicationDeveloper 和 VisualAge for Java 之间的根本不同之处,VisualAge for Java 在它自己的 JVM 中运行所有应用程序,并且总是在调试模式中。而 WebSphere Studio Application Developer 则使用可插式 JVM,并且您可以选择是否要在调试模式中运行。
- 选择您想测试的类。WebSphere Studio Application Developer 给您一个选项,让您选择要用应用程序启动程序(Application Launcher)启动的、在同一个工程中的一组类。
- 这个启动程序将启动另一个 JVM 进程来运行您的应用程序(看一下 Windows Task Manager ,其中将显示一个额外的
javaw 进程,并且将出现一个带 AppDebug.java 源代码的 Debug 视图。)
现在让我们停下来,快速看一下我们在调试模式中可以使用的不同视图和功能。
调试器透视图和调试器任务
Debug/Process/Navigator 视图
Debug 视图显示当前线程、先前终止的线程、执行堆栈和停止时所在的当前断点。请注意,正是这个 debug 视图带有这些熟悉的按钮: Step、 Step into、 Step out、 Run、 Suspend和其它调试控制按钮。
单击 Process 窗格将向您显示当前进程,系统正在用来运行这个应用程序的可执行文件(在我们的案例中是 javaw )。
Navigator 窗格只是一个浏览器,它允许您全面浏览代码,而且不用离开调试透视图就可以再多设置些断点。
图 2. Debug/Process/Navigator 视图
Breakpoint/Inspector/Variables/Inspector 视图
这个视图的缺省窗格是 Breakpoints 视图,您将在其中看到程序中可用断点的列表。您也可以在一个断点上单击鼠标右键并从弹出菜单中选择 HitCount,它告诉调试器在一定数量的命中后停止。如果你想让循环停止于某次迭代,在这样的循环内设置断点,这很有用。
把您的断点的 HitCount设置为 2。
如果您在 Variable 窗格上单击,那么您将有机会看见可用的变量以及它们的值。在任何变量上单击鼠标右键,您都将得到以下选项:
- Inspect-- variables 视图可能包含许多变量。inspector 视图允许您集中在感兴趣的少量变量上。
- Change Value-- 这是一个非常重要的功能。当您选择这个选项时,您将可以改变所选定的变量的值,并可以研究这一改变对程序执行的影响。
- Show Type Names-- 这个选项显示变量的类型。
- Show Qualified Names-- 这个选项允许您看到变量类型的全限定名。
图 3. Breakpoint 视图
图 4. Variables 视图
单击 Run(
)按钮,您将注意到执行将在断点处停止。检查 count 变量和其它变量的值,确认程序执行在循环的第二次迭代处停止。这是我们前面设置的命中计数(hit count)。
Code、Outline 和 Tasks/Console 视图
Code 和 outline 视图跟您在其它透视图中看到过的视图是相同的。tasks 视图也一样,它与 Console 视图共享同一个窗格。这个调试器的优秀功能之一是可以运行到代码的某个点上。
例如,如果我们现在想运行到并停止在循环后面紧跟的语句上,则我们可以在 code 视图中,在该语句上单击鼠标右键并选择 Run to Line。当您单步执行(step-over)该语句时,程序在 console 视图中输出 x 的值。请注意 console 视图如何自动变成活动的窗格。这是 console 视图的缺省行为,每次您输出一些内容时,console 视图都会变成活动的。您可以从 Preferences 对话框的 Debug 窗格改变这种行为和 console 视图中的输出格式。
在运行调试器时修改代码(热修改)
在 VisualAge for Java 中,我们有了“热方法编译(hot method compiling)”功能。这意味着我们可以在调试一个方法时修改该方法内的代码,调试器会自动跳回到执行块的开头,我们可以继续调试而无需重新运行应用程序。这是一个可用于 VisualAge for Java JVM(我们称它为“J9”类 JVM)的功能。这个功能在标准 JVM(例如:WebSphere Studio Application Developer 附带的 JVM)中是没有的。
这个新工具确实虑及了在您修改 WebSphere Application Server 中的 Servlet 后重新装入它。这保证了这个 Servlet 方法的第二次执行将反映您的最新修改。
Servlet/JSP 的调试
要演示编译器调试 Servlet/JSP 的功能,请将 TestEAR.ear 文件装入到名为 TestEAR的工程。如果您遇到了任何编译错误,请确保刚刚创建的 AdderEJB 工程在 AdderWEB 工程的类路径中。
理解 Adder 企业应用程序
我们构建了一个名为 poc.debug.ejbs.AdderSession 的会话 EJB,它提供 strCat 方法,这个方法使用内存缓冲区(在 Java 中将字符串连接起来的快速的、推荐的办法)将两个字符串连接起来。