使用 WebSphere Studio Application Developer 调试器调试 WebSphere 应用程序.docx
《使用 WebSphere Studio Application Developer 调试器调试 WebSphere 应用程序.docx》由会员分享,可在线阅读,更多相关《使用 WebSphere Studio Application Developer 调试器调试 WebSphere 应用程序.docx(16页珍藏版)》请在冰豆网上搜索。
使用WebSphereStudioApplicationDeveloper调试器调试WebSphere应用程序
介绍
2001年,IBM为开放源代码社区引入了Eclipse平台,以努力使其产品的工具对第三方产品更加开放,同时也努力对平台进行总体上的加强。
作为这个战略的一部分,IBM现在提供了一套新工具,用来构建基于Eclipse平台的企业Java™应用程序。
这套新工具称为WebSphere™StudioApplicationDeveloper,它集成了一个基于Java的调试器来作为它自己的调试器。
这给我们带来了很大的好处,因为我们不必再使用两个调试器。
VisualAge™forJava由一个在VisualAgeforJava内进行调试的内部调试器和一个用于调试远程服务器的IBM远程调试器(IBMRemoteDebugger)组成。
现在我们可以使用一个调试器,它可以满足您的全部需要,并且具有IBM一贯提供的丰富的功能。
我们打算在两篇文章中向您介绍这个调试器。
我们假设读者熟练掌握了J2EE、WebSphereStudioApplicationDeveloper开发和部署的基础知识。
在这篇文章中,我们通过在WebSphereStudioApplicationDeveloper内使用EJB、Servlet和JSPs™,向您介绍如何使用这个调试器及其某些基本/集成功能来调试Java应用程序。
我们将采取一种实际操作的办法介绍一个简单的Web应用程序,这个应用程序存在几个相互嵌套的问题(一个问题在JSP代码中,一个问题在Servlet代码中,还有一个问题在EJB代码中),我们将使用这个调试器发现和修正全部三个问题。
在第2部分中,我们将说明,把应用程序部署到WebSphereApplicationServer,高级版(AdvancedEdition(AE))之后,如何使用WebSphereStudioApplicationDeveloper来调试它。
下面的可下载文件,DebugInWSADpt1.zip,包含有本文所描述的类和归档。
调试一个简单的Java应用程序
在调试器中启动您的应用程序
1.切换到(或打开)一个Java透视图。
2.创建一个新的Java工程并将之称为TestDebug。
3.将样本Java应用程序testdebug.jar文件导入到TestDebug工程。
4.请检查poc.debug.app.AppDebug.java。
它是一个简单的应用程序,我们将用它来演示调试器的基础知识。
5.插入一个断点到main方法中的循环内的以下语句:
x=y+z;
要这样做,您可以双击源代码的左窗格,或使用弹出菜单,如下面的图1所示。
6.
图1.向源代码添加断点
7.在工具栏中,单击Debug(
)按钮。
您将看到一个对话框,询问您想使用哪一个启动程序。
选择JavaApplication,选中Setasdefaultlauncher...复选框,然后单击Next。
运行应用程序的另一个按钮是Run(
)按钮。
这个按钮在非调试JavaJVM中运行应用程序,这种JVM的执行速度更快,但不允许调试或使用断点。
这是WebSphereStudioApplicationDeveloper和VisualAgeforJava之间的根本不同之处,VisualAgeforJava在它自己的JVM中运行所有应用程序,并且总是在调试模式中。
而WebSphereStudioApplicationDeveloper则使用可插式JVM,并且您可以选择是否要在调试模式中运行。
8.选择您想测试的类。
WebSphereStudioApplicationDeveloper给您一个选项,让您选择要用应用程序启动程序(ApplicationLauncher)启动的、在同一个工程中的一组类。
9.这个启动程序将启动另一个JVM进程来运行您的应用程序(看一下WindowsTaskManager,其中将显示一个额外的javaw进程,并且将出现一个带AppDebug.java源代码的Debug视图。
)
现在让我们停下来,快速看一下我们在调试模式中可以使用的不同视图和功能。
调试器透视图和调试器任务
Debug/Process/Navigator视图
Debug视图显示当前线程、先前终止的线程、执行堆栈和停止时所在的当前断点。
请注意,正是这个debug视图带有这些熟悉的按钮:
Step、Stepinto、Stepout、Run、Suspend和其它调试控制按钮。
单击Process窗格将向您显示当前进程,系统正在用来运行这个应用程序的可执行文件(在我们的案例中是javaw)。
Navigator窗格只是一个浏览器,它允许您全面浏览代码,而且不用离开调试透视图就可以再多设置些断点。
图2.Debug/Process/Navigator视图
Breakpoint/Inspector/Variables/Inspector视图
这个视图的缺省窗格是Breakpoints视图,您将在其中看到程序中可用断点的列表。
您也可以在一个断点上单击鼠标右键并从弹出菜单中选择HitCount,它告诉调试器在一定数量的命中后停止。
如果你想让循环停止于某次迭代,在这样的循环内设置断点,这很有用。
把您的断点的HitCount设置为2。
如果您在Variable窗格上单击,那么您将有机会看见可用的变量以及它们的值。
在任何变量上单击鼠标右键,您都将得到以下选项:
∙Inspect--variables视图可能包含许多变量。
inspector视图允许您集中在感兴趣的少量变量上。
∙ChangeValue--这是一个非常重要的功能。
当您选择这个选项时,您将可以改变所选定的变量的值,并可以研究这一改变对程序执行的影响。
∙ShowTypeNames--这个选项显示变量的类型。
∙ShowQualifiedNames--这个选项允许您看到变量类型的全限定名。
图3.Breakpoint视图
图4.Variables视图
单击Run(
)按钮,您将注意到执行将在断点处停止。
检查count变量和其它变量的值,确认程序执行在循环的第二次迭代处停止。
这是我们前面设置的命中计数(hitcount)。
Code、Outline和Tasks/Console视图
Code和outline视图跟您在其它透视图中看到过的视图是相同的。
tasks视图也一样,它与Console视图共享同一个窗格。
这个调试器的优秀功能之一是可以运行到代码的某个点上。
例如,如果我们现在想运行到并停止在循环后面紧跟的语句上,则我们可以在code视图中,在该语句上单击鼠标右键并选择RuntoLine。
当您单步执行(step-over)该语句时,程序在console视图中输出x的值。
请注意console视图如何自动变成活动的窗格。
这是console视图的缺省行为,每次您输出一些内容时,console视图都会变成活动的。
您可以从Preferences对话框的Debug窗格改变这种行为和console视图中的输出格式。
在运行调试器时修改代码(热修改)
在VisualAgeforJava中,我们有了“热方法编译(hotmethodcompiling)”功能。
这意味着我们可以在调试一个方法时修改该方法内的代码,调试器会自动跳回到执行块的开头,我们可以继续调试而无需重新运行应用程序。
这是一个可用于VisualAgeforJavaJVM(我们称它为“J9”类JVM)的功能。
这个功能在标准JVM(例如:
WebSphereStudioApplicationDeveloper附带的JVM)中是没有的。
这个新工具确实虑及了在您修改WebSphereApplicationServer中的Servlet后重新装入它。
这保证了这个Servlet方法的第二次执行将反映您的最新修改。
Servlet/JSP的调试
要演示编译器调试Servlet/JSP的功能,请将TestEAR.ear文件装入到名为TestEAR的工程。
如果您遇到了任何编译错误,请确保刚刚创建的AdderEJB工程在AdderWEB工程的类路径中。
理解Adder企业应用程序
我们构建了一个名为poc.debug.ejbs.AdderSession的会话EJB,它提供strCat方法,这个方法使用内存缓冲区(在Java中将字符串连接起来的快速的、推荐的办法)将两个字符串连接起来。
我们还有一个围绕我们的会话bean的访问bean--poc.debug.ejbs.AdderSessionAccessBean。
我们使用WebSphereStudioApplicationDeveloper构建访问这个访问bean的Web,它生成如下内容:
∙poc.debug.Servlet.AdderController--一个Servlet,它将表单的输入导到输出JSP。
∙poc.debug.Servlet.AdderViewBean--这个bean封装调用访问Bean的strCat的逻辑,然后将结果传回到调用者。
∙AdderInputForm.html--这是一张输入表单,它接受用户输入并调用AdderControllerServlet。
∙AdderResults.jsp--这是JSP结果页,它使用AdderViewBean显示结果。
配置/运行应用程序
1.创建WebSphere4.0测试实例/配置(TestInstance/Configuration)并命名为TU(测试单元(TestUnit))。
2.在TU的Configuration中,单击鼠标右键并将TestEAREAR添加到配置中。
3.从Servers视图选择TU服务器并单击Run(
)按钮。
4.在您的Web浏览器中,输入:
http:
//localhost:
8080/Adder/
5.这应自动装入AdderInputForm.html,因为它被配置为一个欢迎页面。
6.在输入表单中,输入任意两个字符串,单击Submit并注意结果。
7.您应得到404errorfilenotfoundAddResultX。
停止服务器,让我们找出如何使用这个调试器来定位这个问题。
调试Servlet
1.在Java或Web透视图中,打开AdderWeb工程并定位到AdderController.performTask()方法。
2.在try块的第一行:
performServices(request,response);,设置一个断点。
3.现在再次启动服务器,但这次请单击Debug(
)按钮,这样服务器将以调试模式启动,并启用了断点。
4.将AdderInputForm.html重新装入到Web浏览器。
5.在输入表单的两个域中输入任意两个字符串并单击Submit。
6.您会注意到Server透视图变成活动的了,您将可以在其中进行调试。
在server透视图中,您将注意到的第一件事是,Debug、Console和Variables窗格共享同一个窗口!
由于在您单步遍历执行(stepthrough)代码的过程中,每当需要检查变量值时都要切换窗口,所以这可能不太方便。
这个问题的解决办法是,或者自己重新安排这些server视图,或者在Debug视图中进行调试,Debug视图更适合于这个过程。
在Debugger透视图中进行调试有两种方式。
第一种容易的方式是在命中代码中的断点之前手工切换到debugger透视图。
这并非总是容易的。
比如说,您在HttpServlet.init()方法(被设置为在启动时自动装入)中设置了一个断点。
所以,现在我们将向您展示如何在Debug透视图中调试服务器,即使您在该服务器或任何其它透视图中获取了断点。
7.切换到Debug透视图
8.在Debug视图中,首先定位到Server进程,如下面的图5所示。
9.
图5.Debug进程视图
10.在运行在server之下的线程的列表中,定位到列表底端附近的线程,也就是紧靠着底端的Suspended(breakpoint...,如下面的图6所示。
如上面的图5所示,由于有+号紧靠着它,定位这个线程显然很容易。
如果展开这个线程,您将看到执行堆栈。
11.
图6.debug视图中的暂挂进程
12.双击该堆栈的顶部,您将在Debug透视图中看到源代码。
13.单步遍历执行您的Servlet代码。
您将看到,我们将变量nextPage的值手工设置为AddResultX。
我们应使用getInitParameters()方法取代它。
14.将代码中的如下一行注释掉:
nextPage="AddResultx";
15.取消对下面这一行(这一行包含正确的代码)的注释:
//nextPage=getInitParameter(request.getParameter("command"));
16.保存Servlet。
前面已经提到过,WebSphereApplicationServer4.0能够自动重新装入Servlet和JSP,所以,您不必在每次更改Servlet或JSP时都重新启动服务器。
17.考虑到实际操作问题,由于我们将不再需要Servlet中的断点,如果您将它除去/禁用,事情将变得更加容易。
18.将输入屏重新装入到Web浏览器。
输入一些值并单击Submit。
19.这次您应得到正确的JSP页面,但打印出来的值是null值。
下一步是调试JSP,看看我们是否有可能进一步修正问题。
调试JSP
1.在您的Web透视图或任何其它透视图中,浏览到AdderResults.jsp文件并打开它。
2.在source窗格中单击,观察这个JSP的源代码。
3.请注意,有Java调用的第一行在第48行。
它的样子象这样:
Stringst1=newjava.lang.String(request.getParameter("str21"));
4.在此行的下一行单击鼠标右键并选择AddBreakpoint。
5.将AdderInputForm.html重新装入到Web浏览器。
6.在输入表单的两个域中输入任意两个字符串并单击Submit。
7.回到debug透视图(如前一部分所述)。
8.单步跳过(stepover)开头两个语句,验证变量str1和str2是否保存了您输入到HTML表单的值。
9.然后,在第50行单击Step-into(
)按钮。
这将把您带到AdderViewbean的代码中。
10.一旦您处在了AdderView源代码中,您将意识到我们正在调用错误的方法。
我们本应该调用AdderView.strCat()方法,而不是AdderView.badStrCat()。
11.所以,现在您将需要回到您的JSP文件,编辑第50行并将它修改为:
Stringmethod0=AdderBean.StrCat(st1,st2);
12.保存JSP。
切勿除去断点(我们将需要它来演示客户机调试和EJB)。
13.重新装入您的输入表单。
在两个域中输入两个不同的值。
例如:
“Hello”和“World”,单击submit。
14.现在,您将注意到null已经消失,但我们将得到第一个字符串与它自身连接在一起形成的字符串。
要修正这一错误,我们将需要再次调试对EJB的JSP调用。
EJB的调试
我们使用EJB访问bean来访问负责完成字符串连接的会话bean。
试图单步跳入(stepinto)对EJB的调用将使我们陷入一片混乱的存根和服务器所生成的代码。
在象这样的情况下,在可能发生问题的调用中的EJB上设置断点是常见的做法。
在我们的例子中是AdderSessionBean.StrCat()。
1.在Java或J2EE透视图中,从AdderEJB工程打开poc.debug.ejbs.AdderSessionBean.java。
2.在StrCat方法的第一个执行行添加一个断点。
3.重新装入您的输入表单。
在两个域中输入两个不同的值(即“Hello”和“World”)并单击Submit。
4.您将首先命中JSP中的断点。
单步跳过前两行,然后单步跳入行号50。
5.在AdderView.StrCat方法中,单步跳过这个样子的行:
ret=bean.StrCat(str1,str2);
请注意,在这个案例中,在应用程序服务器(AppServer)空间中运行的AdderViewbean实际就是我们的EJB的客户机,不过,在这个特定的案例中,它们共享同一个JVM。
所以,如果您在Process视图查看执行堆栈内部,您将注意到它们是在同一个进程上运行。
另一个客户机(在EJBclient.zip中)可以用作独立Java应用程序,用来测试您的EJB。
当您把这个客户机添加到任何Java工程中时,请确保您把下列内容添加到了工程的构建路径。
6.
oj2ee.jar*
oijvejb35.jar*
oAdderEJB工程
(*)这些文件可在\plugins\com.ibm.etools.websphere.runtime\lib目录找到。
当您调试这个应用程序时,您将注意到两个重要事实:
o存在两个独立的进程。
一个用于应用程序,一个用于EJB服务器。
o在您的代码的执行过程中,WebSphereStudioApplicationDeveloper调试器有从一个JVM到另一个JVM来回切换的强大能力。
7.单击Step-over(
)按钮,您会注意到调试器将在EJBStrCat方法内的断点处停止。
8.单步遍历执行EJB,您将认识到错误。
我们只是把str1连接了两次,根本没使用str2。
9.修正这个问题并保存代码。
10.您将需要重新启动服务器以刷新EJB代码。
别忘了要在调试模式中启动它。
与Servlet和JSP的情况不同,当您修改了您的EJB中的代码时,WebSphere4.0将要求重新装入服务器。
11.重新装入您的输入表单,输入数据,跟踪您的代码到EJB语句。
12.验证sf变量是否确实带有正确的值。
请注意,如果您从EJB单击Return(
)按钮,则您将运行回到服务器生成的EJB类。
为了避免发生这样的事情,在堆栈中选择JSP调用就行了,如下面的图7所示。
然后,您可以使用Step-over(
)按钮并继续执行JSP文件。
13.
图7.选择了JSP的Debug进程视图
14.验证返回字符串是否带有正确的值(您输入的字符串的连接)。
现在,您成功地完成了存在问题的Servlet、JSP和EJB代码的调试。
结束语
到目前为止,我们在这篇实际操作的文章中所做的是,向您展示在不同的情形下如何使用WebSphereStudioApplicationDeveloper开发环境调试Java应用程序、Servlet、JSP和EJB。
在下一篇文章中,我们将向您展示如何使用WebSphereStudioApplicationDeveloper调试器调试在WebSphereAE的远程实例中运行的应用程序。
在本系列的第1部分中,我们介绍了新的WebSphere™StudioApplicationDeveloper调试器以及如何在不同的测试情形下使用它。
在本文中,我们将向您展示如何配置WebSphereStudioApplicationDeveloper来调试已经部署到主机的WebSphereApplicationServer,高级版(AE)上的应用程序。
在对部署进行测试时,这一点很有用,并展示了WebSphereStudioApplicationDeveloper的调试器作为远程调试器的新功能。
您可以采用JoeWinchester所写的文章调试在WebSphereApplicationServer内运行的Java代码描述的类似步骤,使用独立的IBM远程调试器(IBMRemoteDebugger)在WebSphereApplicationServer,高级单服务器版(AdvancedSingleServerEdition(AEs))上调试应用程序。
我们决定在本文中不做那些工作,因为WebSphereStudioApplicationDeveloper支持将AEs用作测试服务器,而且也提供动态发布。
我们假设您已经知道如何运行ApplicationServer并且了解ApplicationServer管理的基础知识。
如果您以前使用IBM远程调试器调试过WebSphereApplicationServerAE,则您可以跳过本文的第一部分,因为它是以前的文章,WebSphere开发者园地上JoeWinchester所写的调试在WebSphereApplicationServer内运行的Java代码的重复。
配置ApplicationServer以在调试模式中运行
在WebSphereApplicationServerAE上进行的调试是以每个应用程序服务器为基础的。
这允许您把一个特定的应用程序服务器设置成远程调试,而其它应用程序服务器可以有不同设置。
1.从WebSphere管理控制台单击您想远程调个试的应用程序服务器(applicationserver)。
2.这样做之后,该应用程序服务器的设置将立刻出现在窗口的右边较下部分,如下面的图1所示。
选择JVMsettings窗格。
3.
图1.Applicationserver属性
4.从JVMsettings窗格单击AdvancedJVMSettings...。
要实际看到这个按钮,您得向下滚屏。
5.在如下所示的新打开的对话框中,确保您选择了以下设置:
a.EnableDebugMode被选中。
b.EnableIBMDistribut