远程调试Java应用程序

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

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

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

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

456689 次浏览

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

步骤:

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

详见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技术说明

从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设置:< em > < / em >

< p > 1。点击运行按钮
2.选择Debug Configurations
3.选择“Remote Java Application”
4.新建配置

  • 名称:GatewayPortalProject
  • 项目:GatewayPortal-portlet
  • 连接类型:Socket Attach
  • <李>连接属性: I) localhost ii) 8787

对JBoss < em >: < / em >

< p > 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 >= 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 -jar app.jar命令

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

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

-agentlib: jdwp =运输= dt_socket, server = y,地址= 8000,暂停= n

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

如果你试图远程调试,那么你将得到拒绝连接。从我认为Java 9上你需要做:

-agentlib: jdwp =运输= dt_socket, server = y,地址= *:8000年,暂停= n

或者给它一个需要绑定的IP