我有一个java应用程序运行在linux机器上。我运行java应用程序使用以下:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我在这台Linux机器上为TCP打开了4000端口。我使用eclipse从Windows XP机器,并尝试连接到这个应用程序。我也打开了窗口的端口。
两台机器都在局域网上,但我似乎无法将调试器连接到Java应用程序。我做错了什么?
我有一个java应用程序运行在linux机器上。我运行java应用程序使用以下:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我在这台Linux机器上为TCP打开了4000端口。我使用eclipse从Windows XP机器,并尝试连接到这个应用程序。我也打开了窗口的端口。
两台机器都在局域网上,但我似乎无法将调试器连接到Java应用程序。我做错了什么?
当前回答
对于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接口文档:
JVM TI是在JDK 5.0引入的。JVM TI取代了Java虚拟机分析器接口(JVMPI)和Java虚拟机调试接口(JVMDI),从JDK 6开始,这两个接口不再提供。
其他回答
这是您应该如何设置Eclipse Debugger进行远程调试:
Eclipse设置:
1.点击运行按钮 2.选择调试配置 3.选择“远程Java应用程序” 4.新配置
名称:GatewayPortalProject 项目:GatewayPortal-portlet 连接类型:Socket Attach 连接属性: I) localhost ii) 8787
JBoss:
1.在虚拟机中修改“/路径/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 >= 9:
对于Java 9+, JVM选项需要稍微改变一下,用托管JVM的机器的IP地址作为地址的前缀,或者只是*:
-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n
这是由于在https://www.oracle.com/java/technologies/javase/9-all-relnotes.html#JDK-8041435中注意到的变化。
对于Java < 9,端口号足以连接。
我想强调论证的顺序很重要。
Java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
但是Java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000命令没有。它将把app.jar之后的所有内容作为命令行参数传递。
对于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接口文档:
JVM TI是在JDK 5.0引入的。JVM TI取代了Java虚拟机分析器接口(JVMPI)和Java虚拟机调试接口(JVMDI),从JDK 6开始,这两个接口不再提供。
步骤:
启动远程java应用程序的调试选项,如上面的帖子所述。 通过指定主机和端口为远程调试配置Eclipse。 在Eclipse中启动远程调试并等待连接成功。 设置断点和调试。 如果您想从应用程序开始调试使用suspend=y,这将使远程应用程序一直挂起,直到从eclipse连接。
详细信息请参见Java远程调试的“一步一步”指南。