要设置哪些Java命令行选项以允许对JVM进行远程调试?


321

我知道有一些JAVA_OPTS设置可以远程调试Java程序。

它们是什么,它们是什么意思?

Answers:


303

我将本文标记为针对Java 5及更低版本进行设置。

基本上使用以下命令运行它

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

对于Java 5及更高版本,请使用以下命令运行它:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044

19
值得一提的是,您可能希望配置地址*:1044以便从任何计算机启用远程调试
Herr Derb,

6
HerrDerb是正确的。.由于Java 9“ address = 1044”并不总是在所有接口上侦听。“ address = *:1044”使Java 9+的行为类似于Java 8 ...
alfonx

459

在Java 5.0之前,请使用-Xdebug-Xrunjdwp参数。这些选项在以后的版本中仍然可以使用,但是它将以解释模式而不是JIT运行,这会比较慢。

从Java 5.0开始,最好使用-agentlib:jdwp单个选项:

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

选项-Xrunjdwpagentlib:jdwp参数为:

  • transport=dt_socket :表示用于连接到JVM的方式(套接字是一个不错的选择,可用于调试远程计算机)
  • address=8000 :暴露了TCP / IP端口,以便通过调试器进行连接,
  • suspend=y :如果为“ y”,则告诉JVM等待直到附加了调试器开始执行,否则(如果为“ n”),立即开始执行。

7
您是完全正确的。我尝试使用-Xdebug-Xrunjdwp,但是没有用。当我尝试使用-Xrunjdwpagentlib:jdwp时,它正在工作。(在Java 7上)
RoboAlex 2012年

这仅对我有用,否则会出现以下错误:错误:JDWP非服务器传输dt_socket服务器= y暂停= y地址= 8000必须具有通过“地址=”选项指定的连接地址
振铃

1
是否Xrunjdwp已弃用(或删除了?)为什么我们要agentlib:jdwp接管它?
ArtOfWarfare 2016年

2
我认为你错了。Netbeans -Xdebug -Xrunjdwp在调试Maven项目时使用,它们像JITed一样运行。
Aleksandr Dubinsky

78

由于Java 9.0,JDWP默认情况下仅支持本地连接。 http://www.oracle.com/technetwork/java/javase/9​​-notes-3745703.html#JDK-8041435

对于远程调试,应使用*:in地址运行程序:

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

1
这将获得更多支持,因为这是适用于所有新Java版本的重要提示。
塞巴斯蒂安S

1
请注意:Oracle链接说这将实现相同的旧行为,但是它并不安全,因此不建议这样做。
Chanseok,

9

对于Java 1.5或更高版本:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

对于Java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

对于Java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

这是一个简单程序的输出:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled

5

爪哇

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address 指定允许调试的端口

马文

**使用Maven调试Spring Boot应用程序:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"

2

这是最简单的解决方案。

如果使用的是Maven,则需要进行许多环境特殊配置。因此,如果您从maven启动程序,只需运行mvnDebug命令而不是即可mvn,它将在配置了远程调试的情况下启动您的应用程序。现在,您可以在端口8000上附加调试器。

它会为您解决所有环境问题。


1

命令行

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER

摇篮

gradle bootrun --debug-jvm

马文

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

在这里,我们仅使用套接字连接连接器,当配置了dt_socket传输并且VM在服务器调试模式下运行时,默认情况下启用该连接器。

有关更多详细信息,您可以参考:https : //stackify.com/java-remote-debugging/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.