Java远程DEBUG解决方案
标签: #Share
原理
JPDA(Java Platform Debugger Architecture)是Sun公司开发的 java平台调试体系,它主要有三个层次组成,即 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)
JVMTI(JVMDI): jdk1.4 之前称为JVMDI,之后改为了JVMTI,它是虚拟机的本地接口,其相当于 Thread 的 sleep、yield native 方法
JDWP(Java Debug Wire Protocol):java调试网络协议,其描述了调试信息的格式,以及在被调试的进程(server)和调试器(client)之间传输的请求
JDI:java调试接口,虚拟机的高级接口,调试器(client)自己实现 JDI 接口,比如 idea、eclipse 等
实践
参考文章:https://www.cnblogs.com/wl-blog/p/15838574.html
执行步骤:
- 服务启动时增加命令(开启DEBUG相关模块、指定服务器端口)
- 开启服务所在的远程服务器相关端口
- 本地IDE新建远程DEBUG模块,配置相关参数即可
注意事项:
DEBUG执行的代码块一定要相同(整体代码可以不一样)断点执行一定要完全执行结束,不然会占据相当高的内存空间(也可重启解决)
京东到家实践参考
参考文章:https://confluence.corp.imdada.cn/pages/viewpage.action?pageId=85747261
服务启动时增加命令(开启DEBUG相关模块)
Tomcat:-agentlib:jdwp=transport=dt_socket,address=8088,suspend=n,server=y
export maxParameterCount="1000" export acceptCount="1000" export maxSpareThreads="750" export maxThreads="1000" export minSpareTHreads="50" export URIEncoding="UTF-8" export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms2048m -Xmx4096m -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -Dump.key.prefix=pre_ -agentlib:jdwp=transport=dt_socket,address=8088,suspend=n,server=y"Application:setsid
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jar// 案例、关注第三行 nohup "$JAVACMD" ${TTL_AGENT:-} ${PFINDER_AGENT:-} $JAVA_OPTS\ $OPTS_MEMORY \ -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ -XX:-OmitStackTraceInFastThrow\ -classpath "$CLASSPATH" \ -Dbasedir="$BASEDIR" \ -Dfile.encoding="UTF-8" \ -Dcom.sun.management.jmxremote\ -Dcom.sun.management.jmxremote.port=52001\ -Dcom.sun.management.jmxremote.authenticate=false\ -Dcom.sun.management.jmxremote.ssl=false\服务启动时增加命令(开启DEBUG相关模块、指定服务器端口)
由于京东云对外暴露的接口只有80和443,所以5005端口无法直接访问
因此,配置负载均衡进行转发(
TCP协议)
本地IDE新建远程DEBUG模块,配置相关参数即可
Host可以直接IP或者域名都可,端口理论上是任意的,只要能匹配上即可,例如这里就是80,上面是5005转发至80端口

切换至远程DEBUG,开启调试后,控制台会输出相应日志:
Connected to the target VM, address: ‘stockcentero2o-remotedebug.o2ostock.svc.lf06.n.jd.local:80’, transport: ‘socket’
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!