要设置哪些 Java 命令行选项以允许远程调试 JVM?
Posted
技术标签:
【中文标题】要设置哪些 Java 命令行选项以允许远程调试 JVM?【英文标题】:What are Java command line options to set to allow JVM to be remotely debugged? 【发布时间】:2010-09-13 09:40:14 【问题描述】:我知道有一些 JAVA_OPTS
可以设置为远程调试 Java 程序。
它们是什么,它们是什么意思?
【问题讨论】:
【参考方案1】:在 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'),立即开始执行。
【讨论】:
你是完全正确的。我尝试使用 -Xdebug 和 -Xrunjdwp 但它没有用。当我尝试使用 -Xrunjdwp 或 agentlib:jdwp 时,它正在工作。 (在 Java 7 上) 这只在我用引号引起来时才对我有用,否则我得到这个错误:错误:JDWP 非服务器传输 dt_socket server=y suspend=y address=8000 must have a connection address specified by 'address=' 选项Xrunjdwp
是否已弃用(或已删除?)我们为什么要选择 agentlib:jdwp
代替它?
我认为你错了。 Netbeans 在调试 Maven 项目时使用 -Xdebug -Xrunjdwp
,它们运行起来就像是 JITed。【参考方案2】:
我已将 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
以启用从任何计算机进行远程调试
HerrDerb 是对的。因为 Java 9 "address=1044" 并不总是监听所有接口。 "address=*:1044" 使 Java 9+ 的行为类似于 Java 8...
请注意:不需要添加address
参数。如果未提供,代理将选择一个随机端口号。如果您在同一个 java 命令行中启动多个节点,这可能会很有用。
与仅选择端口相比,使用address=localhost:<debug port>
也更安全【参考方案3】:
从 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
【讨论】:
请注意:Oracle 链接说这将实现相同的旧行为,但不安全且不推荐。 是的,我浪费了几天时间来为 docker-compose 找到这个答案,使用 inteliji 的 docker swarm 调试远程,只需准确(使用*:
):address=*:5005【参考方案4】:
对于 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
【讨论】:
【参考方案5】:java
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar
address
指定允许调试的端口
Maven
**使用 Maven 调试 Spring Boot 应用:
mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
【讨论】:
【参考方案6】:命令行
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER
分级
gradle bootrun --debug-jvm
Maven
mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
【讨论】:
【参考方案7】:这是最简单的解决方案。
如果您使用 Maven,则需要进行很多环境特殊配置。因此,如果您从 maven 启动程序,只需运行 mvnDebug
命令而不是 mvn
,它将负责启动您的应用程序并配置远程调试。现在您可以在端口 8000 上附加一个调试器。
它会为您解决所有环境问题。
【讨论】:
【参考方案8】:-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER
这里我们只使用了一个 Socket Attaching Connector,它在配置 dt_socket 传输并且 VM 在服务器调试模式下运行时默认启用。
更多详情可以参考:https://stackify.com/java-remote-debugging/
【讨论】:
【参考方案9】:如果您使用 java 9 或更高版本,要远程调试(在本地使用 docker 时也是如此),您必须提供--debug *:($port)
。因为从 java 9 --debug ($port)
将只允许在本地调试在远程,而不是在远程。
因此,您可以在 docker-compose 中提供命令,例如
command: -- /opt/jboss/wildfly/bin/standalone.sh --debug *:8787
【讨论】:
以上是关于要设置哪些 Java 命令行选项以允许远程调试 JVM?的主要内容,如果未能解决你的问题,请参考以下文章