当前位置: 代码网 > it编程>编程语言>Java > java程序远程debug原理与配置全过程

java程序远程debug原理与配置全过程

2025年09月27日 Java 我要评论
背景日常工作中,每个程序员都会遇到bug。也往往会需要调试远程环境中的程序,这时候就需要远程调试。eclipse、idea等ide工具可以远程调试,本质上都是实现了java 的平台调试体系&mdash

背景

日常工作中,每个程序员都会遇到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 得到数据,发出指令。

模块间联系

调试者通过 jdi 发送接受调试命令。

  • jdwp 定义调试者和被调试者交流数据的格式。
  • jvmti 可以控制当前虚拟机运行状态。

ibm对三个模块的详细介绍

使用

#对于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)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com