要设置哪些 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

-Xrunjdwpagentlib:jdwp 参数的选项是:

transport=dt_socket :表示连接JVM的方式(socket是个不错的选择,可以用来调试远程电脑) address=8000 : TCP/IP 端口暴露,从调试器连接, suspend=y : 如果是 'y',告诉 JVM 等到调试器连接后开始执行,否则(如果是'n'),立即开始执行。

【讨论】:

你是完全正确的。我尝试使用 -Xdebug-Xrunjdwp 但它没有用。当我尝试使用 -Xrunjdwpagentlib: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?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Maven 命令行远程调试 Java 应用程序

[Java代码审计]——远程调试初探

eclipse下的jetty远程调试设置

怎么实现远程调试

MSVSMON.exe(远程调试)必须打开哪些端口才能正常工作?

如何使用J-Link远程调试?