286

我有一个在 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 应用程序。我究竟做错了什么?

4

7 回答 7

510

编辑:我注意到有些人在这里剪切和粘贴调用。我最初给出的答案仅与 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. 选项位于类名之前。类名之后的任何参数都是程序的参数!
于 2009-06-10T12:47:23.923 回答
87

对于 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 技术说明

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

还有一点需要注意,来自JVM Tool 接口文档

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

于 2014-03-25T10:12:40.037 回答
33

脚步:

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

有关完整的详细信息,请参阅Java 远程调试的分步指南。

于 2011-11-15T04:35:12.563 回答
30

涵盖 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 < 9,端口号足以连接。

于 2019-06-30T09:23:20.977 回答
13

我想强调论点的顺序很重要

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之后的所有内容作为命令行参数传递。

于 2019-09-08T14:18:02.893 回答
3

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

日食设置:

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

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

对于 JBoss:

/path/toJboss/jboss-eap-6.1/bin/standalone.conf1.按如下方式更改您的虚拟机中的:通过删除#取消注释以下行:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

对于Tomcat:

catalina.bat文件中:

第1步:

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

第2步:

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

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

catalina.sh jpda start

然后,您需要在要调试的 Java 类中设置断点

于 2016-06-28T22:48:22.803 回答
0

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

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

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

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

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

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

于 2021-06-18T12:55:24.307 回答