|
在创建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应用的角度来看,这些线程是没有意义的。

图2:打开和关闭"smart debugging"时的调用栈。
调试搜索路径
通常,在进行单步调试时,有些你想让ide搜索的路径或者zip文件不在项目中。这时,你可以将这些文件添加到application属性下的debug search path中。在这个列表中,顺序是很重要的。当ide试图找到代表某个类的一个文件时,ide将从顶部开始。你将注意到缺省情况下ide首先查找当前项目。
|