【问题标题】:Remote debugging a Java application远程调试 Java 应用程序
【发布时间】:2010-11-01 19:04:50
【问题描述】:

我有一个在 linux 机器上运行的 java 应用程序。我使用以下命令运行 java 应用程序:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

我在这台 Linux 机器上为 TCP 打开了 4000 端口。我使用 Windows XP 机器上的 eclipse 并尝试连接到这个应用程序。我也在windows中打开了端口。

两台机器都在 LAN 上,但我似乎无法将调试器连接到 Java 应用程序。我做错了什么?

【问题讨论】:

标签: java debugging remote-debugging


【解决方案1】:

编辑:我注意到有些人在这里剪切和粘贴调用。我最初给出的答案仅与 OP 有关。这是一种更现代的调用风格(包括使用更传统的 8000 端口):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

原始答案如下。


试试这个:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

这里有两点:

  1. runjdwp 选项中没有空格。
  2. 选项位于类名之前。类名后面的任何参数都是程序的参数!

【讨论】:

  • @DJGummikuh 不错!我已经更新了帖子以使用更新样式的-agentlib 选项来满足您的剪切和粘贴乐趣。 :-)
  • 我们是否总是需要让远程应用程序的源代码出现在我们进行远程调试的机器上?
  • 你需要知道源代码。要么你有 .java 文件,要么你有 .jar / .class 文件与反编译器相结合。 Eclipse 等 IDE 可以安装 JDecompiler 等反编译器,这样您就可以像调试 .java 文件一样调试 .class 文件(不包括 cmets)。
  • 值得重复来自 stackoverflow.com/a/138518/500902 的评论,“由于 Java 9 "address=1044" 并不总是监听所有接口。"address=*:1044" 使 Java 9+ 的行为类似于 Java 8 " 允许从不同的主机调试
【解决方案2】:

对于 JDK 1.3 或更早版本:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

对于 JDK 1.4

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

对于较新的 JDK:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

请根据您的需要更改端口号。

来自java technotes

从 5.0 开始,-agentlib:jdwp 选项用于加载和指定 JDWP 代理的选项。对于 5.0 之前的版本,-Xdebug 和 使用 -Xrunjdwp 选项(5.0 实现还支持 -Xdebug 和 -Xrunjdwp 选项,但较新的 -agentlib:jdwp 选项更可取,因为 5.0 中的 JDWP 代理使用 JVM TI 接口到 VM 而不是旧的 JVMDI 接口)

还有一点需要注意,来自JVM Tool interface documentation

JVM TI 是在 JDK 5.0 中引入的。 JVM TI 取代了从 JDK 6 开始不再提供的 Java 虚拟机分析器接口 (JVMPI) 和 Java 虚拟机调试接口 (JVMDI)。

【讨论】:

  • 以下适用于 Eclipse 的默认设置:-agentlib:jdwp=transport=dt_socket,server=y,address=8000
【解决方案3】:

步骤:

  1. 使用上述帖子中所述的调试选项启动您的远程 Java 应用程序。
  2. 通过指定主机和端口配置 Eclipse 以进行远程调试。
  3. 在 Eclipse 中启动远程调试并等待连接成功。
  4. 设置断点和调试。
  5. 如果您想从应用程序开始调试,请使用 suspend=y ,这将使远程应用程序保持暂停状态,直到您从 eclipse 连接。

详情请参阅Step by Step guide on Java remote debugging

【讨论】:

  • 链接中的“分步指南”使用了一些过时的选项。
【解决方案4】:

答案涵盖 Java >= 9:

对于 Java 9+,JVM 选项需要稍作更改,方法是在地址前加上托管 JVM 的机器的 IP 地址,或者只是 *

-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n

这是由于https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 中提到的更改。

对于Java

【讨论】:

    【解决方案5】:

    我想强调参数的顺序很重要

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jar 命令打开调试器端口

    java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 命令没有。它会将 app.jar 之后的所有内容作为命令行参数传递。

    【讨论】:

    • 我猜这是因为在您的第二个示例中,“app.jar”之后的所有内容都作为参数传递到您的 main 方法中
    • @xoXZeusXox 哈哈。是的,它作为参数传递。感谢提及。
    • 这对 java 11 来说似乎是新的
    【解决方案6】:

    这是您应该如何设置 Eclipse 调试器以进行远程调试:

    Eclipse 设置:

    1.点击运行按钮
    2.选择调试配置
    3.选择“远程Java应用程序”
    4.新配置

    • 名称:GatewayPortalProject
    • 项目:GatewayPortal-portlet
    • 连接类型:套接字连接
    • 连接属性: i) 本地主机 ii) 8787

    对于 JBoss:

    1.在你的虚拟机中更改/path/toJboss/jboss-eap-6.1/bin/standalone.conf,如下所示: 通过删除 #:

    取消注释以下行
    JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
    

    对于 Tomcat:

    catalina.bat 文件中:

    第一步:

    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
    

    第二步:

    JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
    

    第 3 步:从命令提示符运行 Tomcat,如下所示:

    catalina.sh jpda start
    

    然后你需要在你想要调试的 Java 类中设置断点

    【讨论】:

    • 在 Java 8 中,JDK 支持 JAVA_TOOL_OPTIONS 环境变量,以便为您需要使用的任何 Java 应用程序启用调试器:JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n p.s.很抱歉编辑,与格式化程序打架。
    • 对 NetBeans 有任何想法吗?
    【解决方案7】:

    对于遇到问题的每个人,如果您真的从一台机器到另一台机器进行远程调试,那么使用:

    -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n

    还不够,因为它现在(至少在 unix/osx 机器上)绑定到 localhost,所以你只能从 localhost 连接到它。

    如果您尝试对此进行远程调试,那么您将因此被拒绝连接。从我认为 Java 9 上你需要做的:

    -agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n

    或提供一个需要绑定的ip *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2012-08-04
      • 2020-03-18
      相关资源
      最近更新 更多