1、背景
测试验证过程中我们肯定都遇到过线上问题本地怎么都无法复现的经历,而这一类问题往往是需要我们通过经验尝试性的修复,过程也比较痛苦且低效,没办法快速定位到问题原因。此时可以尝试使用远程debug将线上部署程序像本地调试一样验证问题
2、idea 中新建 debug 调试
理解内容:执行 java -agentlib:jdwp=help 查看帮助信息
a、参数含义:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
-agentlib:<libname>[=<选项>] 加载指定的本机代理程序库
suspend:在启动时是否就等待,表示程序一启动就停下,等待远程调试 socket 和它建立连接。transport:传输规范,用 JDWP 调试程序一般叫做:dt_socket。
address:调试地址。
server:是否监听调试器,需要改成 y,要监听调试器。
launch:当事件发生时运行调试器
onthrow:抛出异常时
onuncaught:没有捕获异常时
timeout:监听超时时间
JDWP:Java Debug Wire Protocol 缩写,定义了调试器(debugger)和 Java 虚拟机(target vm)之间的通信协议
JDWP协议规范文档 https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/jdwp-spec.html
3、服务器 JVM 启动参数中添加 -agentlib
a、定义环境变量:
JPDA_OPTS = -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
b、jar 启动
java $JPDA_OPTS -jar test.jar
c、war 启动
JAVA_OPTS="$JAVA_OPTS $JPDA_OPTS"