远程调试Java应用程序

时间:2009-06-10 12:27:51

标签: java debugging remote-debugging

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

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

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

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

8 个答案:

答案 0 :(得分:439)

编辑:我注意到有些人正在剪切并粘贴调用。我最初给出的答案仅与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 :(得分:76)

对于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取代了Java虚拟机概要分析程序接口(JVMPI)和Java虚拟机调试接口(JVMDI),从JDK 6开始,不再提供这些接口。

答案 2 :(得分:27)

步骤:

  1. 使用调试选项启动远程Java应用程序,如上文所述。
  2. 通过指定主机和端口来配置Eclipse以进行远程调试。
  3. 在Eclipse中启动远程调试并等待连接成功。
  4. 设置断点和调试。
  5. 如果你想从应用程序启动调试使用suspend = y,这将使远程应用程序暂停,直到你从eclipse连接。
  6. 有关详细信息,请参阅Step by Step guide on Java remote debugging

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我想强调参数顺序很重要

对我来说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命令并非

答案 5 :(得分:0)

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

Eclipse设置:

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

  • 名称:GatewayPortalProject
  • 项目:GatewayPortal-portlet
  • 连接类型:套接字附件
  • 连接属性: i)localhost 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类中设置断点

答案 6 :(得分:0)

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

-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 *

答案 7 :(得分:-10)

调试的最佳选择是创建日志和分析日志。但在某些情况下,我们需要调试部署在服务器上的Web应用程序。

请参阅Remotely debug a java web application链接。这里描述了完整的远程调试流程。希望它会有所帮助。