【发布时间】:2010-09-13 09:40:14
【问题描述】:
我知道有一些 JAVA_OPTS 可以设置为远程调试 Java 程序。
它们是什么,它们是什么意思?
【问题讨论】:
我知道有一些 JAVA_OPTS 可以设置为远程调试 Java 程序。
它们是什么,它们是什么意思?
【问题讨论】:
在 Java 5.0 之前,使用 -Xdebug 和 -Xrunjdwp 参数。这些选项在以后的版本中仍然有效,但它将以解释模式而不是 JIT 模式运行,这会更慢。
从 Java 5.0 开始,最好使用 -agentlib:jdwp 单选项:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044
-Xrunjdwp 或 agentlib:jdwp 参数的选项是:
transport=dt_socket :表示连接JVM的方式(socket是个不错的选择,可以用来调试远程电脑)address=8000 : TCP/IP 端口暴露,从调试器连接,suspend=y : 如果是 'y',告诉 JVM 等到调试器连接后开始执行,否则(如果是'n'),立即开始执行。【讨论】:
Xrunjdwp 是否已弃用(或已删除?)我们为什么要选择 agentlib:jdwp 代替它?
-Xdebug -Xrunjdwp,它们运行起来就像是 JITed。
我已将 this article 加入书签,以便为 Java 5 及更低版本进行设置。
基本上run it with:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
对于Java 5 and above,运行它:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044
【讨论】:
*:1044 以启用从任何计算机进行远程调试
address参数。如果未提供,代理将选择一个随机端口号。如果您在同一个 java 命令行中启动多个节点,这可能会很有用。
address=localhost:<debug port> 也更安全
从 Java 9.0 开始,JDWP 默认只支持本地连接。 http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435
对于远程调试,应运行地址为*: 的程序:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
【讨论】:
*:):address=*:5005
对于 java 1.5 或更高版本:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>
对于 java 1.4:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>
对于 java 1.3:
java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>
这是一个简单程序的输出:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
【讨论】:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar
address 指定允许调试的端口
**使用 Maven 调试 Spring Boot 应用:
mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
【讨论】:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER
gradle bootrun --debug-jvm
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
【讨论】:
这是最简单的解决方案。
如果您使用 Maven,则需要进行很多环境特殊配置。因此,如果您从 maven 启动程序,只需运行 mvnDebug 命令而不是 mvn,它将负责启动您的应用程序并配置远程调试。现在您可以在端口 8000 上附加一个调试器。
它会为您解决所有环境问题。
【讨论】:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
这里我们只使用了一个 Socket Attaching Connector,它在配置 dt_socket 传输并且 VM 在服务器调试模式下运行时默认启用。
【讨论】:
如果您使用 java 9 或更高版本,要远程调试(在本地使用 docker 时也是如此),您必须提供--debug *:($port)。因为从 java 9 --debug ($port) 将只允许在本地调试在远程,而不是在远程。
因此,您可以在 docker-compose 中提供命令,例如
command: -- /opt/jboss/wildfly/bin/standalone.sh --debug *:8787
【讨论】: