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

执行步骤:

  1. 服务启动时增加命令(开启DEBUG相关模块、指定服务器端口)
  2. 开启服务所在的远程服务器相关端口
  3. 本地IDE新建远程DEBUG模块,配置相关参数即可

注意事项:

  1. DEBUG执行的代码块一定要相同(整体代码可以不一样)
  2. 断点执行一定要完全执行结束,不然会占据相当高的内存空间(也可重启解决)

京东到家实践参考

参考文章:https://confluence.corp.imdada.cn/pages/viewpage.action?pageId=85747261

  1. 服务启动时增加命令(开启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\
  2. 服务启动时增加命令(开启DEBUG相关模块、指定服务器端口)

    由于京东云对外暴露的接口只有80和443,所以5005端口无法直接访问

    因此,配置负载均衡进行转发(TCP协议

    image-20221101161032494

  3. 本地IDE新建远程DEBUG模块,配置相关参数即可

    Host可以直接IP或者域名都可,端口理论上是任意的,只要能匹配上即可,例如这里就是80,上面是5005转发至80端口

    image-20221101161123024

    切换至远程DEBUG,开启调试后,控制台会输出相应日志:

    Connected to the target VM, address: ‘stockcentero2o-remotedebug.o2ostock.svc.lf06.n.jd.local:80’, transport: ‘socket’


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

关于婚姻的答案 上一篇
单测实践 下一篇