【问题标题】:What are Java command line options to set to allow JVM to be remotely debugged?要设置哪些 Java 命令行选项以允许远程调试 JVM?
【发布时间】:2010-09-13 09:40:14
【问题描述】:

我知道有一些 JAVA_OPTS 可以设置为远程调试 Java 程序。

它们是什么,它们是什么意思?

【问题讨论】:

    标签: java debugging


    【解决方案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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-09-10
                • 2016-02-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多