【IT168 技术文档】
在创建Java应用程序时,发现和修正bug通常比最初编写源代码所花费的时间还要多。所以很显然,当创建J2EE快速开发环境时, WebLogic Workshop开发团队需要建立一个新的环境,这个环境应该使得调试比以前更快、更容易。
为了做到这一点,我们支持两种不同的调试模式,以及使调试更快、更容易的一些新设置:
1. Java调试模式(Java Debugging Mode)--这种模式可使Java应用程序的调试与任何其他Java 调试器相同。
2. Workshop 调试模式(Workshop Debugging Mode)--这种调试模式是特别针对Workshop应用程序的,而且我们加倍付出了努力使得连接和调试这些应用程序更加容易。这使得在WebLogic Workshop上的应用程序级别的调试更加容易。
3. 智能调试(Smart Debugging)--这是一个设置,可以通过打开这个设置从调用栈和线程窗口中筛选出一些常见的WebLogic类和线程,并在单步调试时绕过这些类。
4. 不同线程挂起策略(Different Thread Suspension Strategies)--为了改善单步调试的性能,在调试时WebLogic Workshop支持不同的线程挂起策略。
调试模式是由当前项目的内容所决定的。如果你的一个Workshop应用需要服务器的支持,比如一个Web应用,你需要设置的调试模式为Workshop调试模式,否则,建议设置调试模式为Java调试模式。
通过项目属性可以设置或取消新的调试设置,可以通过"Tools -> Project Properties"菜单项找到项目属性。
有很多与调试相关的配置。这部分将讲述以下项目的调试:
Web应用
Java 应用程序
连接到一个正在运行的Java应用程序
远程 Web应用
处于Production mode环境下的域
非Workshop应用
调试 Web应用
在开始之前,让我们首先看一个示例应用程序。我们从SamplesApp开始,因为它已经有了一个配置好的域以及一些示例文件,可以用于运行和调试。
首先,打开应用程序SamplesApp。打开文件HelloWorld.jws,然后按下IDE工具栏上的开始按钮。如果提示你启动服务器,那么现在就启动它。
如果服务器运行在开发模式中,你将注意到有3个命令shell被创建,如果操作系统是Windows的话。(在 Linux上创建的是3个java进程,但是没有可视窗口)。这些进程包括:
1) 正在运行应用程序的 WebLogic服务器。
2)一个调试代理服务器,它方便调试并允许更快的远程调试。
3) Pointbase数据库控制台,因为它是针对示例Workshop域的缺省数据库。
当该服务器作好被调试的准备时,运行你的应用程序的页面的浏览器便会出现。这时,调试被激活。调试代理已经连接到WebLogic服务器进程,并且IDE已经建立了与调试代理之间的通信。
图1: WebLogic Workshop IDE以及测试浏览器
可以通过在文件HelloWorld.jws中的第30行设置断点来进行演示。接着,如果你在浏览器中单击"Hello"按钮,你就可以找到IDE中的断点。
调试标准的Java 应用程序
除了调试Web应用外,Workshop还允许你调试标准的Java应用程序。我们继续用SamplesApp进行试验。
1. 按下IDE工具栏中的Stop 按钮(如果你仍然在运行HelloWorld.jws的话)。
2. 打开ProxyClient项目中的文件MazeClient.java。
3. 在main方法中设置一个断点。
4. 按下IDE工具栏中的开始按钮。你将找到断点。
5. 按下IDE工具栏中的继续按钮。
6. 等到"Enter rows"出现在Output窗口中。
7. 按下IDE工具栏中的Pause按钮。
现在你可以查看Call Stack框或者Threads框,看看进程在做什么。通过这样做,你可能会注意到一个问题:该进程正在等候来自于控制台的输入,而IDE没有任何用于输入的控制台。要正确调试该应用程序,我们需要从命令行运行这个程序并连接它。
连接正在运行的进程
在进一步讲解之前,你应该阅读 ProxyClient项目中的readme.html。确保你能够从命令行运行该项目。
1. 打开build.xml,然后向javac ant任务中添加debug="true"
2. 在命令行中输入"ant compile"。
3. 打开run.bat。(或者如果你运行的是Linux,就打开run.sh)
4. 插入参数"-Xdebug -Xrunjdwp:transport=dt_socket,address=2235,suspend=n,server=y"。
5. 输入"run",从命令行运行MazeGen。
现在你需要设置调试器选项来连接到那个进程。
1. 在IDE中右键单击ProxyClient项目,然后选择Properties选项。
2. 进入调试器面板。
3. 在Debugging Options下,单击"Attach to Process"单选按钮。
4. 现在,在"Attach To Process Settings"下将端口设置为2235。
5. 单击OK。
现在当你打开文件MazeClient.java并按下开始按钮时,IDE将停止在你设置的断点处。使用同样的技术将调试器连接到任意正在运行的Java进程。
远程调试Web应用
远程调试Web应用简单而快速。当你启动服务器时创建的调试代理更会加快这一场景的进度。我们已经创建了一个代理,这个代理与IDE之间采用一中很笼统的协议。然后代理将这个协议翻译为更细粒度、但是更详细的JVM 可以理解的JDI(Java调试接口)协议。这就使得通过网络的调试信息数量大大减少。为了演示这一点,需要另一台安装了Workshop的机器:
1. 进入另一台安装了Workshop的机器,并启动Workshop。
2. 打开SamplesApp。
3. 在Tools菜单下打开Application特性,并把Hostname设置为第一台机器的名称。
4. 进入文件 HelloWorld.jws,并在Hello()中设置一个断点,位置是该函数的返回行。
5. 按下Start按钮。你现在应该可以正常调试了。
警告:当按照这种方法进行调试时,你将不能把改动部署到服务器上。你对源代码所做的任何改动都需要通过WebLogic 控制台重新建立和重新部署。
调试Production模式的服务器
有时问题可能暴露在测试机器、两阶段调试(staging)机器或者运行在一个生产域(production domain)上的其他机器上。你可能希望能够在这样的环境中连接和调试应用程序。但是,当一个域处于生产模式的时候,它不会使用可以使调试更简单的大部分我们喜欢的东西。这意味着要调试生产域,将需要做更多的工作 。你将需要:
1. 修改文件startWebLogic.cmd(如果你的系统为Linux,则修改startWebLogic.sh),加入调试参数(参见上面的"连接正在运行的进程"一节)。
2. 在IDE中,需要假定你正在调试一个Java应用程序。这意味着你将需要创建一个Java应用程序并在其中添加一个文件。该文件只是一个占位程序,所以你可以启动该项目。
正确完成这些步骤后,启动你的Production服务器。然后进入IDE,打开占位程序文件,然后按下 Start按钮,IDE 现在应该连接上了,那么就可以调试该服务器了。你仍然可以打开SmartDebugging ,这样你就可以绕过不感兴趣的WebLogic线程和类。不幸的是,在生产模式中,不能调试XScript文件。
非Workshop应用
如果你试图在不支持Workshop的WebLogic Server 域上调试应用程序。那么有两种选择:
1. 可以按照上面的"调试Production服务器"一节中的指示,或者
2. 可以按照 Workshop帮助中的"How Do I: WebLogic Workshop-Enable an Existing WebLogic Server Domain?"主题中的说明,来启用WebLogic Server域的Workshop支持。
高级 Workshop调试主题
当创建Workshop时,我们添加了大量的特性,以便用户能更好地浓缩他们所调试的应用程序上。这些特性或者使调试速度加快,或者尽可能地筛选出不重要的信息。
Web应用中的线程
当运行一个Web应用,单击断点或者单击暂停时,我们并没有暂停VM中所有的线程。我们只暂停了WebLogic Server的用户线程。这主要是考虑到性能的问题。事实证明,停止和启动VM中的所有线程需要花费很多时间,而且,从Web应用的角度来看,这些线程是没有意义的。
如果你观察一个项目的调试属性,你将注意到一个名为"Pause All Threads After Stepping"的选项。这决定了我们在调试会话中暂停线程时所用的策略。无论这个复选框是否被选中,无论你何时单击断点或者单击暂停按钮,所有用户线程都将被暂停。进行单步调试时,所有线程都将重新启动。但是,当你完成了该步骤时所发生的情况取决于该复选框是否被选中。如果该复选框被选中,则按照单步调试,所有用户线程将被冻结。这给出了大多数调试器的行为,但是速度会慢很多。如果该复选框没有选中,只有被单步调试的线程会停止。这样速度就会快很多,而这也是缺省的;但是,如果你需要看到所有线程的列表,就需要按下暂停按钮。
智能调试
在断点时,查看一下调用栈。它将只包含用于应用程序中当前方法的栈帧。通常,这恰好是你所需要的。在调用栈中有正在运行的WebLogic 服务器的许多层,其中包括一些自动生成的类,这些类用于实现我们筛选出的Web 服务。但是,如果你确定需要在你的代码周围看到更多的系统代码,那么可以关闭该特性。为了做到这一点,进入Tools菜单,打开该项目的项目属性。然后你可以进入调试器特性,并取消对"Smart Debugging"复选框的选择。
你需要通过单击Stop按钮来重启调试会话,然后再次单击Start 按钮。但是,当你单击一个断点时,将看到更多完整的栈帧。
图2:打开和关闭"Smart Debugging"时的调用栈。
调试搜索路径
通常,在进行单步调试时,有些你想让IDE搜索的路径或者zip文件不在项目中。这时,你可以将这些文件添加到Application属性下的Debug Search Path中。在这个列表中,顺序是很重要的。当IDE试图找到代表某个类的一个文件时,IDE将从顶部开始。你将注意到缺省情况下IDE首先查找当前项目。