java程序远程debug原理与配置

背景

日常工作中,每个程序员都会遇到bug。也往往会需要调试远程环境中的程序,这时候就需要远程调试。
eclipse、idea等IDE工具可以远程调试,本质上都是实现了Java 的平台调试体系—— JPDA (Java Platform Debugger Architecture,JPDA)。
这个体系为开发人员提供了一整套用于调试 Java 程序的 API,是一套用于开发 Java 调试工具的接口和协议。也就是说JPDA是JVM的调试标准,任何JDK都必须实现。

组成

JPDA 由三个独立的模块 JVMTI(Java VM工具界面)、JDWP(Java调试线协议)、JDI (Java调试接口)组成。

简单来说,JPDA把调试过程分解成几个很自然的概念:调试者(debugger)和被调试者(debuggee),以及他们中间的通信器。被调试者运行于我们想调试的 Java 虚拟机之上,它可以通过 JVMTI 这个标准接口,监控当前虚拟机的信息;调试者定义了用户可使用的调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果。在调试者和被调试着之间,调试命令和调试结果,都是通过 JDWP 的通讯协议传输的。所有的命令被封装成 JDWP 命令包,通过传输层发送给被调试者,被调试者接收到 JDWP 命令包后,解析这个命令并转化为 JVMTI 的调用,在被调试者上运行。类似的,JVMTI 的运行结果,被格式化成 JDWP 数据包,发送给调试者并返回给 JDI 调用。而调试器开发人员就是通过 JDI 得到数据,发出指令。

JPDA组成

模块间联系

调试者通过 JDI 发送接受调试命令。
JDWP 定义调试者和被调试者交流数据的格式。
JVMTI 可以控制当前虚拟机运行状态。

IBM对三个模块的详细介绍

JVMTI 的简介
JDWP 协议及实现
Java 调试接口(JDI)

使用

#对于JDK1.4版本,使用:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9001
#对于JDK1.5以上的版本,JVM参数是:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9001
参数说明

-Xdebug:通知JVM工作在debug模式下;
-Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境;
transport:有两种形式,分别是socket和shared memory,需要跨机器,只能用socket;
server:server=y表示当前是调试服务端,=n表示当前是调试客户端;
address:端口号,这里采用的是tcp协议。我们可以使用 cat /etc/services | grep '9001' 来查看该端口是否开启;
suspend:如果是y,则需要等B机器上的debugger开启后,程序才会开始运行。否则,程序启动时候不会挂起,直接运行;如果设置为y,它会阻塞程序运行,直到有客户端连接到对应的监听端口(这里是9527),程序才真正开始执行。我们有时候会抱怨程序一闪而过,还没来得及在本地加载上代码程序就执行完了,这种情况就可以使用suspend参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值