企业应用远程调试全攻略
1. 调试设置基础
调试设置的主要部分包含在 JPDA 选项
-Xrunjdwp
的子选项中。这些子选项是由逗号分隔的名值对,格式为
-Xrunjdwp:name1=value1,name2=value2,...
。以下是 JPDA 设置的子选项说明:
| 选项 | 描述 |
| — | — |
| transport | 必需项。用于连接调试器应用程序的传输类型,可能的值为
dt_socket
和
dt_shmem
。
dt_socket
使用 TCP/IP 连接调试器,通用性最强;
dt_shmem
使用共享内存,目前参考实现仅在 Windows 上可用。 |
| server | 非必需项,默认值为
n
。如果设置为
y
,应用程序将作为服务器应用程序,即应用程序会监听调试器的连接。若指定了
address
选项,调试器将在该地址位置连接;否则,服务器应用程序会将监听地址输出到标准输出。 |
| address | 当
server = n
时为必需项。若
server
选项为
n
,
address
选项指定调试器的连接地址;若
server
选项为
y
,
address
选项指定服务器的监听地址。当
transport
为
dt_socket
时,地址指的是应用服务器监听的主机和端口号。若未指定地址,应用程序将随机选择并输出一个监听端口号,为避免客户端配置中端口号的持续调整,建议指定端口地址。 |
| suspend | 非必需项,默认值为
y
。如果
suspend
选项为
y
,应用程序启动时将立即暂停;如果为
n
,应用程序将运行直到遇到断点。 |
使用这些调试选项,你可以设置服务器环境,使应用程序在调试虚拟机(VM)中运行。服务器以调试模式运行后,任何时候只能有一个调试器连接到它。
2. 远程应用调试准备
在轻松调试远程应用之前,必须设置客户端调试环境。假设客户端机器上运行着 JBuilder,服务器上运行着符合 JPDA 的 JDK,需要完成以下步骤:
1. 使用调试设置启动远程应用。
2. 将远程应用文件复制到客户端。
3. 为远程服务器设置运行时配置。
4. 在代码中设置断点。
2.1 使用调试设置启动远程应用
如果服务器运行的是符合 JPDA 的 JDK,可使用以下命令行启动服务器应用以进行远程调试:
java –Xdebug –Xnoagent –Djava.compiler=NONE –Xrunjdwp:transport=dt_socket,server=y,address=5000,suspend=n –classpath <CLASSPATH> <MyClass>
如果服务器在 JBuilder 中运行,需在运行时配置设置的 VM 参数中添加以下选项:
-classic –Xdebug –Xnoagent –Djava.compiler=NONE –Xrunjdwp:transport=dt_socket,
这些示例命令和参数设置将 Java VM 以调试模式启动,
MyClass
应用程序被识别为服务器应用程序,调试器监听端口 5000,服务器应用程序将在不等待调试器连接的情况下运行。
如果服务器应用程序在应用服务器的上下文中运行,可能需要更改应用服务器的配置文件。
2.2 将远程应用文件复制到客户端
为了正确调试远程应用,远程应用的
.java
和
.class
文件在服务器和客户端上必须相同。如果任何一方的
.class
文件不匹配,调试过程中可能会出现奇怪且不可预测的行为。只要两台机器上的文件相同,在服务器或客户端编译应用程序代码都可以。调试器使用远程应用文件的本地副本设置断点并调试远程应用。
2.3 设置远程应用的运行时配置
为了在远程应用上设置断点,需要在客户端机器上设置运行时配置。使用远程应用文件在 JBuilder 中创建一个运行时配置条目,JBuilder 将使用此配置条目连接到远程应用。
创建服务器的运行时配置步骤如下:
1. 从菜单中选择“Run” -> “Configuration”,将显示“Project Properties”配置对话框。
2. “Project Properties”对话框的“Run”选项卡上的“New”、“Copy”和“Edit”按钮用于维护运行时配置。
3. 在“Run”选项卡的“Application”子选项卡中,“Main Class”字段应指定远程应用的主类。设置完成后,需要为远程应用配置调试选项。
4. 显示的“Debug”选项卡中包含可用的远程调试选项,具体如下表所示:
| 选项 | 描述 |
| — | — |
| Enable remote debugging | 选中后,运行时配置不会实际运行应用程序,而是实现 JPDA 功能以连接到远程应用。 |
| Launch | 若选中,应用程序将在远程机器上启动,这需要使用位于
JBuilder/remote
目录中的
DebugServer
应用程序。 |
| Attach | 若选中,应用程序将连接到已运行的远程应用。 |
| Host name | 运行远程应用的服务器名称。 |
| Port number | 若选择“Launch”按钮,此处输入
Debug Server
的端口地址。 |
| Remote classpath | 若选择“Launch”按钮,此处输入远程类路径。 |
| Remote working directory | 若选择“Launch”按钮,此处输入应用程序的远程工作目录。 |
| Transport Type | 提供
dt_socket
以及可选的
dt_shmem
选项,大多数情况下,
dt_socket
是远程调试的首选且唯一方法。 |
| Address | 当远程应用在调试 VM 下启动时,它会设置一个监听端口或随机选择一个。“Address”字段保存调试器将连接到的远程应用的端口号。 |
JBuilder 可以通过连接到远程应用或在远程机器上启动远程应用来与远程应用通信。
若要连接到远程应用,必须选择“Attach”单选按钮,输入主机名和地址。地址可以是启动远程应用时确定的,也可以是远程应用随机选择的。无论哪种情况,“Address”字段必须包含远程应用确定的地址。设置这些字段后,JBuilder 将尝试连接到远程应用。
若要在远程机器上启动远程应用,需要在远程机器上安装 JBuilder 附带的
DebugServer
应用程序。
DebugServer
应用程序位于 JBuilder 主目录的
remote
子目录中,由一个
.jar
文件和适用于 Unix 和 DOS/Windows 的 shell 脚本组成。需要将
DebugServer.jar
文件复制到远程机器上,若远程机器是 Unix 机器,还需复制
DebugServer
脚本文件;若为 DOS 或 Windows 机器,则复制
DebugServer.bat
文件。
DebugServer
脚本的语法如下:
DebugServer <debugserver.jar_dir> <jdk_home_dir> <-port portnumber> <-timeout milliseconds>
其参数说明如下表:
| 参数 | 描述 |
| — | — |
| debugserver.jar_dir | 远程机器上
DebugServer.jar
文件所在的目录。 |
| jdk_home_dir | 远程机器上 JDK 主目录所在的目录。 |
| -port portnumber | (可选)
DebugServer
监听调试器启动命令的端口号,该端口号对应于上表中的“Port Number”选项,默认值为 18699。 |
| -timeout milliseconds | (可选)
DebugServer
在尝试将远程计算机连接到客户端计算机时等待的毫秒数,默认值为 60,000。 |
DebugServer
设置并运行后,运行时配置设置中的启动功能将启动远程应用。无论选择启动还是连接到远程应用,调试过程都是相同的,即 JBuilder 运行服务器运行时配置,并与远程应用建立连接。
2.4 在代码中设置断点
打开远程应用代码并设置行断点。设置断点后,使用运行时配置调试远程应用,当到达断点时,远程应用代码将停止处理。
如果远程应用以
suspend
选项设置为
y
启动,远程应用将在等待调试连接后才开始运行。此时,当 JBuilder 在客户端机器上开始调试远程应用时,调试窗口将立即暂停,点击“恢复调试”按钮,远程应用将在服务器上开始运行。
客户端应用程序可以在 JBuilder 中运行或调试。无论哪种情况,如果客户端应用程序运行时遇到标记有断点的行,JBuilder 调试器将在断点处暂停执行,可使用 JBuilder 调试器修改和评估变量,并逐行执行代码。
3. 跨进程断点
跨进程断点会使调试器在进入单独进程中的类时停止。你可以指定在任何方法调用或特定方法调用时停止。使用跨进程断点,你可以从客户端进程进入服务器进程,而无需在客户端和服务器进程中都设置断点。
设置跨进程断点的步骤如下:
1. 打开服务器项目中的源代码文件。
2. 从菜单中选择“Run” -> “Add Breakpoint” -> “Add Cross Process Breakpoint”,将显示“Add Cross-Process Breakpoint”对话框。
3. “Add Cross-Process Breakpoint”对话框只需填写“Class name”字段。如果只填写了“Class name”字段,当类中的任何方法执行时,断点将停止执行。
4. 如果选择了“method name”,将显示所选类中可用方法的对话框。选择方法后,方法的参数将自动填充到“Add Cross-Process Breakpoint”对话框的“Method arguments”字段中,这些参数用于识别正确的函数签名,因为 Java 中可能存在重载方法。
“Add Cross-Process Breakpoint”对话框中的其余字段与相关章节中“更多调试选项”部分的断点字段相同,这些字段允许你停止执行和/或将表达式记录到文件中,断点可以根据条件或执行次数激活。
需要注意的是,在远程调试应用程序时,你可以在服务器应用程序代码的某一行上设置断点,其行为与使用跨进程断点相同。
4. 应用服务器的配置设置
应用服务器主要用于为应用程序提供服务框架,应用程序可以利用应用服务器的数据库缓存、数据库池、资源管理、事务管理和安全管理服务。应用服务器通过控制虚拟机(VM)来管理应用程序的生命周期,因此必须修改应用服务器启动 VM 的过程,即告知应用服务器以调试模式启动 VM。
如果能以调试模式启动应用服务器,最重要的参数是应用服务器的监听地址,调试器需要该地址才能远程连接到运行中的服务器。以下是几种常见应用服务器的远程调试配置方法:
4.1 Inprise Application Server 5.x
如果使用 Inprise Application Server,可以将 EJB 容器/分区设置为支持 JPDA。通过右键单击分区名称并选择“配置”菜单选项,可以进入标准 EJB 分区的配置属性页面。
4.2 Weblogic Server 7.0
为了启用远程调试,Weblogic Server 必须使用调试选项启动,其启动应用服务器是通过执行命令脚本实现的,因此需要修改这些命令脚本以开启远程调试。为确保安全,以下步骤会对修改的命令脚本进行复制:
1. 找到应用程序的
startWeblogic.cmd
文件,通常位于
c:\bea\user_projects\mydomain
目录中,复制该文件并将其重命名为
startRemoteWeblogic.cmd
。
2. 打开
startRemoteWeblogic.cmd
文件,找到如下行:
call “c:\bea\weblogic700\server\bin\startWLS.cmd”
- 将该行修改为:
call “c:\bea\weblogic700\server\bin\startRemoteWLS.cmd”
- 保存文件。
-
进入
c:\bea\weblogic700\server\bin目录,找到startWLS.cmd文件,复制并将其重命名为startRemoteWLS.cmd。 -
打开
startRemoteWLS.cmd文件,进行如下修改:
set CLASSPATH=%JAVA_HOME%\lib\tools.jar;C:\Borland\JBuilder7\lib\jaxrpc.jar;
➥C:\Borland\JBuilder7\lib\jds.jar;C:\Borland\JBuilder7\lib\j
➥dsremote.jar;C:\Borland\JBuilder7\lib\jdsserver.jar;
➥%WL_HOME%\server\lib\weblogic_sp.jar;
➥%WL_HOME%\server\lib\weblogic.jar;%CLASSPATH%
@rem Start Server
@echo off
if “%ADMIN_URL%” == “” goto runAdmin
@echo on
“%JAVA_HOME%\bin\java” -classic %MEM_ARGS% -Xdebug -Xnoagent
➥-Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,
➥address=6000,suspend=n %JAVA_OPTIONS% -classpath”%CLASSPATH%”
➥-Dweblogic.Name=%SERVER_NAME% -Dbea.home=”C:\bea”
➥-Dweblogic.management.username=%WLS_USER%
➥-Dweblogic.management.password=%WLS_PW%
➥-Dweblogic.management.server=%ADMIN_URL%
➥-Dweblogic.ProductionModeEnabled=%STARTMODE%
➥-Djava.security.policy=”%WL_HOME%\server\lib\weblogic.policy”
➥-Daxis.enableListQuery=true weblogic.Server
goto finish
:runAdmin
@echo on
“%JAVA_HOME%\bin\java” -classic %MEM_ARGS% -Xdebug -Xnoagent
➥-Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,
➥address=6000,suspend=n %JAVA_OPTIONS% -classpath”%CLASSPATH%”
➥-Dweblogic.Name=%SERVER_NAME% -Dbea.home=”C:\bea”
➥-Dweblogic.management.username=%WLS_USER%
➥-Dweblogic.management.password=%WLS_PW%
➥-Dweblogic.ProductionModeEnabled=%STARTMODE%
➥-Djava.security.policy=”%WL_HOME%\server\lib\weblogic.policy”
➥-Daxis.enableListQuery=true weblogic.Server
:finish
此步骤修改了启动
weblogic.Server
应用程序的命令,使其开启调试功能。服务器启动后,将在端口地址 6000 启用远程调试,需修改 JBuilder 中服务器应用程序的运行时配置,使其地址与之匹配。
4.3 Websphere Server 4
Websphere 对 JPDA 有原生支持,但问题在于确定调试器使用的地址编号,具体操作步骤如下:
1. 加载 Websphere 控制台。
2. 在树视图中定位应用服务器,选择应用服务器后,控制台右侧将出现配置面板。
3. 选择“JVM Setting”选项卡。
4. 点击“Advance Settings”按钮,可能需要滚动屏幕才能看到该按钮。
5. 在对话框中,选中“Enable distributed debugger”复选框。
6. 关闭服务器和控制台。
7. 启动服务器,服务器启动时会在屏幕上显示状态信息,其中最后一行会显示“Debug support is available on port:”,该行末尾出现的数字必须与相关配置中的“Address”字段匹配。
记得修改相关项目属性,完成这些操作后,即可连接到 EJB 服务器并调试代码。
4.4 iPlanet Server
iPlanet 有一个基于 Web 的管理程序,可在其中设置 JVM 选项。在 JVM 选项设置下,设置以下值:
-Xdebug,-Xnoagent,-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5000
JVM 选项在
jvm12.conf
文件中设置。需要注意的是,iPlanet 的 Web 管理程序存在一个 bug,当输入上述选项时,iPlanet 会在选项中间强制插入硬回车,导致格式错误的选项被读取,从而使调试 JVM 无法正确设置。为解决此问题,需打开
jvm12.conf
文件,手动将选项添加到
jvm.option
设置中。若后续使用 Web 管理程序调整这些设置,更改将丢失,需重新修改
jvm12.conf
文件。
4.5 其他服务器
如果你使用的是上述未提及的其他应用服务器,可搜索该应用服务器的文档,查找远程调试或 JPDA 支持相关内容。此外,Borland 的开发者网站也提供了关于其他应用服务器的有用提示和技巧。
5. 实践操作
要进行以下实践操作,需要满足以下条件:
- 一台运行 JBuilder 和 Borland Enterprise Server 5.0x 的客户端机器。
- 一台运行 JDK 1.3.1 或更高版本以及 Borland Enterprise Server 的服务器机器。
- 两台机器必须通过 TCP/IP 在网络上相互访问。
实践操作分为以下三个步骤:
1. 在服务器机器上设置服务器应用。
2. 在客户端机器上设置服务器应用。
3. 在客户端机器上调试服务器应用。
此实践使用之前开发的 CORBA 应用程序,已解决的 CORBA 应用程序副本位于相关目录中。
5.1 在服务器机器上设置服务器应用
此步骤需将服务器应用文件从客户端机器复制到服务器机器,假设文件将安装在服务器的 C 盘上,具体操作如下:
1. 找到客户端机器上的
jbbook\ch26\swing\classes\chalktalk
目录,将
chalktalk
子目录复制到服务器机器上,并记住其在服务器上的位置。
2. 在服务器机器上,确保
chalktalk
子目录的位置包含在
CLASSPATH
环境变量中。例如,若将
chalktalk
目录复制到
c:\jbbook\ch26
,可输入以下命令:
set CLASSPATH=C:\jbbook\ch26\.;%CLASSPATH%
- 设置好路径后,输入以下命令以调试模式启动服务器,调试地址为 5000:
java -classpath %CLASSPATH% -Xdebug -Xnoagent -Djava.compiler=NONE
➥-Xrunjdwp:transport=dt_socket,server=y,address=5000,
➥suspend=n chalktalk.courseServerApp
- 若正确安装了服务器应用程序,将看到相应的对话框。
5.2 在客户端机器上设置服务器应用
此步骤需在客户端机器上打开 JBuilder 应用程序,打开示例项目的步骤如下:
1. 从 JBuilder 菜单中选择“File” -> “Open Project”。
2. 找到
jbbook\ch26\swing\ChalkTalk.jpx
文件并点击“OK”。
3. 从 JBuilder 菜单中选择“Run” -> “Configurations”,将显示“Project Properties”对话框的“Run”选项卡。
4. 选择“Server Application”配置并点击“Edit”按钮,将显示“Runtime Properties”对话框的“Debug”选项卡。
5. 选中“Enable remote debugging”复选框。
6. 选择“Attach”按钮。
7. 在“Host name”字段中输入服务器机器的名称。
8. 在“Address”字段中输入 5000。
9. 点击“OK”。
10. 在“Project Properties”对话框中点击“OK”。
11. 在项目面板中右键单击
courseAppServer
文件,从弹出菜单中选择“Debug” -> “Use Server Application”。若设置正确,将看到相应的显示。
此时,客户端机器上的服务器应用已成功连接到服务器机器上运行的服务器应用。
5.3 在客户端机器上调试服务器应用
客户端应用程序将针对服务器应用程序执行,我们将在服务器应用程序代码中设置一个断点,当到达某一行时停止执行,然后修改一个变量并确保服务器返回修改后的数据,具体操作如下:
1. 在项目面板的
chalktalk.course.server
树节点下找到
CourseDataCorbaImpl.java
文件。
2. 双击
CourseDataCorbaImpl.java
文件,使其内容显示在内容面板中。
3. 找到第 61 行,内容如下:
sCourseNumber[0] = “CS251”;
- 在该行上按 F5 键或右键单击该行并从弹出菜单中选择“Toggle Breakpoint”来设置断点。
-
在项目面板的
com.sams.chalktalk.client.swing树节点下找到ChalkTalkClient.java文件。 -
右键单击
ChalkTalkClient.java文件,从弹出菜单中选择“Run” -> “Use ChalkTalkClient”。 - 应用程序将运行,从主菜单中选择“File” -> “Browse Courses”,JBuilder 将通知你服务器应用程序已在断点处停止。
- 在内容面板上右键单击,从弹出菜单中选择“Evaluate/Modify”。
- 在“Evaluate/Modify”对话框的“Expression”字段中输入以下行:
sCourse[0] = “Introduction to Remote Debugging”
- 点击“Evaluate”按钮,若成功更改值,对话框将显示相应内容。
- 点击“Evaluate/Modify”对话框上的“Close”按钮。
- 点击命令栏上的“Resume Debugging Session”按钮。
- 查看客户端应用程序,验证数据是否已更改。
通过以上步骤,你可以全面掌握企业应用的远程调试方法,从基础的调试设置到不同应用服务器的配置,再到实际的实践操作,逐步深入了解并运用远程调试技术。
企业应用远程调试全攻略(续)
6. 调试过程中的注意事项
在进行企业应用远程调试时,有一些重要的注意事项需要牢记,这些注意事项可以帮助你避免常见的问题,确保调试过程顺利进行。
6.1 文件一致性
正如前面提到的,远程应用的
.java
和
.class
文件在服务器和客户端上必须保持一致。这是因为调试器依赖于这些文件的一致性来准确地设置断点和执行调试操作。如果文件不一致,可能会导致调试器无法正确定位断点,或者在调试过程中出现不可预期的行为。因此,在复制文件时,务必确保文件的完整性和一致性。
6.2 端口冲突
在设置调试端口时,需要注意避免端口冲突。不同的应用程序可能会使用相同的端口,如果发生端口冲突,调试器将无法正常连接到远程应用。在选择端口时,建议使用未被其他应用程序占用的端口。例如,在设置
address
选项时,确保指定的端口号在服务器和客户端上都是可用的。
6.3 防火墙设置
防火墙可能会阻止调试器与远程应用之间的通信。在进行远程调试之前,需要确保防火墙允许相关的端口和协议通过。例如,如果使用
dt_socket
传输类型,需要确保 TCP/IP 端口是开放的。你可以通过配置防火墙规则来允许调试器与远程应用之间的通信。
6.4 调试器版本兼容性
确保客户端和服务器上的调试器版本兼容。不同版本的调试器可能会有不同的功能和接口,如果版本不兼容,可能会导致调试过程中出现问题。在进行远程调试之前,建议检查并确保客户端和服务器上的调试器版本一致。
7. 调试技巧和最佳实践
除了遵循上述注意事项外,还可以采用一些调试技巧和最佳实践来提高调试效率和准确性。
7.1 使用日志记录
在代码中添加适当的日志记录可以帮助你更好地了解程序的执行流程和状态。在调试过程中,日志记录可以提供额外的信息,帮助你定位问题。例如,在关键的代码段添加日志输出,记录变量的值和程序的执行路径。可以使用 Java 的日志框架,如
java.util.logging
或
SLF4J
来实现日志记录。
7.2 逐步调试
在调试过程中,建议采用逐步调试的方法。可以使用调试器的单步执行功能,逐行执行代码,观察变量的变化和程序的执行流程。这样可以帮助你更细致地了解程序的执行过程,发现潜在的问题。同时,还可以使用条件断点,只在满足特定条件时停止执行,提高调试效率。
7.3 代码审查
在调试之前,进行代码审查可以帮助你发现一些潜在的问题。仔细检查代码逻辑,确保代码的正确性和一致性。可以使用代码审查工具来辅助审查过程,例如静态代码分析工具可以帮助你发现代码中的潜在错误和不良实践。
7.4 团队协作
在企业应用开发中,通常需要团队成员之间的协作。在调试过程中,团队成员可以相互交流和分享经验,共同解决问题。例如,当遇到复杂的问题时,可以组织团队会议,共同分析问题的原因和解决方案。
8. 总结
通过本文的介绍,我们详细了解了企业应用远程调试的相关知识和操作步骤。从调试设置的基础,到远程应用调试的准备工作,再到不同应用服务器的配置和实践操作,我们逐步掌握了远程调试的技术和方法。
在调试过程中,需要注意文件一致性、端口冲突、防火墙设置和调试器版本兼容性等问题。同时,采用一些调试技巧和最佳实践,如使用日志记录、逐步调试、代码审查和团队协作等,可以提高调试效率和准确性。
希望本文能够帮助你更好地进行企业应用的远程调试,在开发过程中快速定位和解决问题,提高开发效率和质量。
9. 流程图:远程调试整体流程
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(设置客户端调试环境):::process
B --> C(使用调试设置启动远程应用):::process
C --> D(将远程应用文件复制到客户端):::process
D --> E(设置远程应用的运行时配置):::process
E --> F(在代码中设置断点):::process
F --> G{选择连接方式}:::decision
G -->|Attach| H(连接到已运行的远程应用):::process
G -->|Launch| I(在远程机器上启动应用):::process
H --> J(开始调试):::process
I --> J
J --> K(遇到断点停止):::process
K --> L{是否需要修改变量}:::decision
L -->|是| M(修改变量):::process
L -->|否| N(继续调试):::process
M --> N
N --> O(完成调试):::process
O --> P([结束]):::startend
10. 表格:调试常见问题及解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 无法连接到远程应用 | 端口冲突、防火墙阻止、地址设置错误 | 检查端口是否被占用,配置防火墙允许通信,检查地址设置是否正确 |
| 断点未触发 | 文件不一致、调试器版本不兼容 | 确保服务器和客户端文件一致,检查调试器版本是否兼容 |
| 调试过程中程序崩溃 | 代码逻辑错误、内存不足 | 进行代码审查,检查内存使用情况,优化代码 |
| 变量值显示异常 | 数据类型不匹配、代码逻辑错误 | 检查变量的数据类型,审查代码逻辑 |
超级会员免费看
1684

被折叠的 条评论
为什么被折叠?



