生产环境问题排查
jdwp
什么是jdwp?
JDWP(Java Debug Wire Protocol)即Java调试线协议,是一个专为Java调试设计的通讯交互协议。以下是对JDWP的详细解释:
一、定义与作用
JDWP定义了调试器(debugger)和被调试的Java虚拟机(target vm)之间的通信协议。通过此协议,调试器可以获取目标虚拟机的类、对象、线程等信息,并控制Java程序的执行。在Java应用开发中,JDWP是实现远程调试和本地调试的关键技术。
二、工作原理
- 握手阶段:在传输层连接建立完成后,调试器会发送一个14个字符的ASCII字符串“JDWP-Handshake”到目标Java虚拟机。目标Java虚拟机在收到该字符串后,会回复同样的字符串,以此完成握手过程。握手成功后,调试器就可以开始向目标Java虚拟机发送调试命令。
- 通信阶段:JDWP通过命令(command)和回复(reply)进行通信。调试器发送命令包(command packet)来获取目标Java虚拟机的信息或控制程序的执行,而目标Java虚拟机则通过发送回复包(reply packet)来回应这些命令。此外,目标Java虚拟机还可以通过发送命令包来通知调试器某些事件的发生,如到达断点或产生异常。
三、数据包结构
JDWP的数据包分为命令包和回复包两种类型,它们都由包头(header)和数据(data)两部分组成。
- 包头:包头的结构和长度是固定的,包含整个包的长度、唯一标识符(Id)、标志位(Flags)和命令集(Command Set)等信息。
- 数据:数据的长度是可变的,具体内容视数据包的内容而定。例如,请求一个对象成员变量值的命令包中,数据部分就包含该对象的ID和成员变量的ID;而回复包中则包含该成员变量的值。
四、数据类型
JDWP还定义了一些数据类型,专门用来传递Java相关的数据信息。这些数据类型包括:
- TaggedObject:表示一个被标记的Java对象,包含唯一标识对象的objectID和附加信息(如类名称、类型签名等)。
- ArrayReference:表示一个Java数组对象,包含唯一标识数组的arrayID和数组的长度、元素类型等信息。
- ClassObjectReference:表示一个Java类对象,包含唯一标识类的classID和类的名称、加载器等信息。
- Field:表示一个Java字段,包含唯一标识字段的fieldID和字段的名称、类型、修饰符等信息。
- Method:表示一个Java方法,包含唯一标识方法的methodID和方法的名称、参数、返回值类型、修饰符等信息。
- Location:表示Java代码中的一个位置,包含标识所在类的classID和标识代码位置的codeIndex。
五、安全性考虑
由于JDWP是调试协议,通常不包含认证信息。因此,在开启调试端口的Java应用中,如果未采取适当的安全措施,攻击者可能会利用JDWP进行调试,并最终执行恶意命令。这构成了潜在的安全隐患。为了保障安全,建议在使用JDWP进行调试时,采取必要的安全措施,如限制调试端口的访问权限、使用防火墙等。
综上所述,JDWP是Java调试中不可或缺的重要技术。通过了解JDWP的工作原理和数据包结构等信息,可以更好地利用这一技术进行Java应用的调试和开发。同时,也需要注意其潜在的安全隐患,并采取相应的安全措施来保障应用的安全。
jdwp使用
使用https://gitee.com/dexterleslie/demonstration/tree/master/demo-java/demo-java-assistant示例协助测试
编译示例
mvn package运行示例启用jdwp
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar target/demo.jartransport:指定传输方式,如dt_socket(使用套接字连接)或dt_shmem(使用共享内存连接)。server:指定是否作为服务器等待调试器连接(y)或连接到指定的调试器(n)。suspend:指定是否在启动时被调试程序暂停等待调试器连接(y)或继续执行(n)。address:指定传输连接的地址或端口号。
使用IDEA远程调试,打开Edit Configurations ...配置界面,新增Remote JVM Debug配置信息如下:
Debugger mode为Attach to remote JVMHost为192.168.235.128(运行jdwp java进程所在的主机ip)Port为5005Command line arguments for remote JVM为自动生产不需要手动编辑- 选择
JDK 5 - 8 Use module classpath选择demo-java-assistant
点击Debug按钮连接到jdwp java进程。
添加条件断点(条件为param1.equals("hello")),访问接口http://localhost:8080/api/v1/jdwp/debug?param1=hello即可命中条件断点。
添加异常断点(捕获异常为Exception),访问接口http://localhost:8080/api/v1/jdwp/debug?param1=exception即可命中异常断点。
BTrace
注意:因为需要编写脚本,所以暂时不使用此工具。
什么是BTrace?
BTrace是一个由Sun公司推出的、用于Java平台的动态、安全追踪(监控)工具。以下是对BTrace的详细解释:
一、定义与功能
BTrace通过向运行中的Java程序植入字节码文件,实现对运行中的Java程序的动态跟踪和监控。它能够在不重启应用的情况下,方便地获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等。同时,BTrace的设计确保了其对被监控程序的侵入性最小,占用系统资源最少。
二、使用场景
- 日志分析:BTrace可以用来做代码日志跟进,记录方法执行过程中的关键信息,帮助开发者了解程序的运行状态。
- 性能监控:BTrace可以监控接口性能变慢的问题,分析各个方法的耗时,从而找出性能瓶颈。
- 异常分析:BTrace可以用来分析异常信息,帮助开发者快速定位并解决问题。
- 系统信息收集:BTrace还可以用来收集系统相关信息,如GC(垃圾回收)及调用栈信息等,为系统优化提供数据支持。
三、使用限制
由于BTrace会把脚本逻辑直接侵入到运行的代码中,所以在使用上有很多限制,以确保不影响程序的正常运行。这些限制包括:
- 不能创建对象。
- 不能使用数组。
- 不能抛出或捕获异常。
- 不能使用循环。
- 不能使用synchronized关键字。
此外,不恰当的使用BTrace可能导致JVM崩溃,如在BTrace脚本中使用错误的class文件。因此,在上生产环境之前,务必在本地充分验证脚本的正确性。
四、使用方法
使用BTrace通常需要以下步骤:
- 下载并配置BTrace:从BTrace的官方GitHub页面(https://github.com/btraceio/btrace)下载BTrace的运行包,并配置好环境变量和依赖。
- 编写BTrace脚本:根据监控需求,编写BTrace脚本。脚本中需要使用BTrace提供的注解来定义需要分析的方法入口和参数。
- 运行BTrace脚本:将编写好的BTrace脚本应用到运行中的Java程序上,BTrace会将脚本逻辑注入到程序中,开始收集运行时的数据。
五、总结
BTrace是一个功能强大的Java动态追踪工具,它能够在不重启应用的情况下,方便地获取程序运行时的数据信息。但是,由于其对被监控程序的侵入性,使用时需要遵守一定的限制,并确保脚本的正确性。在生产环境中,BTrace是一个非常有价值的工具,可以帮助开发者快速定位并解决问题。
arthas
详细用法请参考 链接