我有一个运行如下的java进程
tomcat 3400481 2.1 19.3 6323248 1579708 ? Sl Feb08 32:20 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Xms1024M -Xmx2048M -server -XX:+UseParallelGC -javaagent:/opt/opentelemetry-javaagent.jar -javaagent:/opt/tomcat/jmx_prometheus_javaagent-0.19.0.jar=9092:/opt/tomcat/tomcat.yml -Dignore.endorsed.dirs= -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n org.apache.catalina.startup.Bootstrap start
通过端口转发到这台机器,我可以使用 Intellij Idea 的 JVM 调试器轻松附加到此进程,在
catalina.out
中,我看到了唯一这样的日志条目:
Listening for transport dt_socket at address: 8000
没有任何提示,我只是看到调试开始并且它有效
当我用
jconsole
附加到相同内容时,我在日志中看到:
Debugger failed to attach: handshake failed - received >< - expected >JDWP-Handshake<
Debugger failed to attach: recv failed during handshake: Resource temporarily unavailable
并且 JConsole 拒绝连接:
error during jrmp connection establishment nested exception is java.io.eofexception
造成这种不同行为的原因是什么?
Jconsole
与运行远程调试的 java (JDK 9) 版本相同。
目前我没有任何详细信息,也不知道要检索什么样的详细信息来解决问题。如果某些聪明的驴子知道需要哪种细节,欢迎他们发表评论,询问需要哪种细节来澄清问题。在我看来,很明显 Intellij Idea 调试器使用与 JConsole 相同的协议。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.122.97.13
添加是为了解决该问题。
了解调试所需的
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
与 jconsole 所需的 jmx 远程不同,这一点非常重要。