我有一个运行在Linux机器上的Java应用程序。我使用以下命令来运行Java应用程序:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我已经在这台Linux机器上打开了TCP端口4000。我从Windows XP机器使用Eclipse并尝试连接到此应用程序。我也在Windows上打开了该端口。
两台机器都在局域网中,但似乎无法将调试器连接到Java应用程序。我做错了什么?
我有一个运行在Linux机器上的Java应用程序。我使用以下命令来运行Java应用程序:
java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n
我已经在这台Linux机器上打开了TCP端口4000。我从Windows XP机器使用Eclipse并尝试连接到此应用程序。我也在Windows上打开了该端口。
两台机器都在局域网中,但似乎无法将调试器连接到Java应用程序。我做错了什么?
编辑:我注意到有些人在这里剪贴调用。我最初给出的答案只适用于提问者。这是一个更现代的调用方式(包括使用更常规的端口8000):
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n
<other arguments>
注意:使用address=8000
(如上所示),调试服务器只会监听localhost
(参见如何设置Java命令行选项以允许远程调试JVM?)。如果您希望服务器监听所有接口,以便能够通过网络进行调试,请使用address=*:8000
。显然,只在受限制的、可信任的网络上执行此操作...
以下是原始答案。
试试这个:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp
runjdwp
选项中不能有空格。对于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接口而不是旧的JVMDI接口)
还有一件事需要注意,来自JVM工具接口文档:
JVM TI在JDK 5.0中引入。JVM TI取代了Java虚拟机分析器接口(JVMPI)和Java虚拟机调试接口(JVMDI),在JDK 6中不再提供。
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远程调试的逐步指南。
我想强调的是参数顺序很重要。
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远程调试器的方法:
Eclipse配置:
1.点击运行按钮
2.选择调试配置
3.选择“远程Java应用程序”
4.新建配置
针对JBoss:
1.在您的VM中更改/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"
JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
catalina.sh jpda start
JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
p.s.对于编辑很抱歉,正在与格式化程序作斗争。 - Nathan Niesen对于所有遇到远程调试问题的人,如果您在一台机器上进行远程调试到另一台机器,则使用:
-agentlib:jdwp = transport = dt_socket,server = y,address = 8000,suspend = n
是不够的,因为它现在绑定到本地主机(至少在unix / osx机器上),所以您只能从本地主机连接到它。
如果您尝试远程调试,则会收到连接被拒绝的错误。我认为从Java 9开始,您需要执行以下操作:
-agentlib:jdwp = transport = dt_socket,server = y,address = *:8000,suspend = n
或者给出一个IP地址,它需要绑定到hat *。
build.gradle:
run {
jvmArgs = ["-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=5005"
}