繁体   English   中英

远程调试 Java 应用程序

[英]Remote debugging a Java application

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

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

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

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

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

对于 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 工具接口文档

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

脚步:

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

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

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

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

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

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

日食设置:

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

  • 名称:网关门户项目
  • 项目: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 9开始,JDWP套接字连接器默认情况下仅接受本地连接。 参见: http : //www.oracle.com/technetwork/java/javase/9​​-notes-3745703.html#JDK-8041435

因此,要从外部启用调试连接,请指定*:作为地址:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM