远程调试Java应用程序


254

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




根本没有重复。首先,这是一个比较老的问题。其次,这个问题的答案应该与调试环境无关。
艾迪生

Answers:


476

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


2
@DJGummikuh太好了!我已经更新了帖子,以使用更新的样式-agentlib选项为您带来切切的乐趣。:-)
克里斯·杰斯特·杨

我们是否始终需要在进行远程调试的计算机中提供远程应用程序的源代码?
MasterJoe2

您需要知道源代码。您可以使用.java文件,也可以将.jar / .class文件与反编译器结合使用。诸如Eclipse之类的IDE可以安装诸如JDecompiler之类的反编译器,以便您可以调试.class文件,就好像它是.java文件一样(不包括注释)。
伊万·萨特里亚

1
值得重复此stackoverflow.com/a/138518/500902的评论,“由于Java 9“ address = 1044”并不总是在所有接口上侦听。“ address = *:1044”使Java 9+的行为类似于Java 8“允许从其他主机进行调试
Marvin

84

对于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)。


以下内容适用于Eclipse的默认设置:-agentlib:jdwp = transport = dt_socket,server = y,address = 8000
Sundae

29

脚步:

  1. 如上文所述,使用调试选项启动远程Java应用程序。
  2. 通过指定主机和端口,将Eclipse配置为进行远程调试。
  3. 在Eclipse中启动远程调试,然后等待连接成功。
  4. 设置断点和调试。
  5. 如果要从应用程序开始进行调试,请使用suspend = y,这将使远程应用程序保持挂起状态,直到从eclipse连接为止。

有关完整详细信息,请参见Java远程调试的循序渐进指南



8

我想强调,论据的顺序很重要

对我来说, 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命令没有


3
我想这是因为在您的第二个示例中,“ app.jar”之后的所有内容都作为参数传递给您的主方法
xoX Zeus Xox

@xoXZeusXox哈哈。是的,它作为参数传递。感谢您的提及。
MrBlack

1

这是设置Eclipse Debugger进行远程调试的方式:

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文件中:

第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类中设置断点


在Java 8中,JDK支持JAVA_TOOL_OPTIONS环境变量,以便为您需要使用的任何Java应用程序启用调试器:JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps抱歉,所做 的编辑与格式化程序不兼容。
内森·尼森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.