调试标准的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应用的角度来看,这些线程是没有意义的。