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

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

#1 楼

我将本文标记为针对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


评论


值得一提的是,您可能希望将地址配置为*:1044以启用从任何​​计算机进行的远程调试

– Herr Derb
18年8月24日在11:58



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

– alfonx
18/09/5在13:47

请注意:不需要添加address参数。如果未提供,则代理将选择一个随机端口号。如果您在同一java命令行中启动多个节点,这可能会很有用。

–asbachb
7月1日14:57



与仅选择端口相比,使用address = localhost:也更安全

–解码
11月5日23:28

#2 楼

在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:暴露了TCP / IP端口,可以从调试器进行连接。

address=8000:如果为'y ',告诉JVM等待直到连接了调试器开始执行,否则(如果为'n'),立即开始执行。


评论


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

–RoboAlex
2012年6月1日下午6:02

这仅对我有用,当我用引号引起来时,否则会出现此错误:错误:JDWP非服务器传输dt_socket服务器= y暂停= y地址= 8000必须具有通过'address ='选项指定的连接地址

–环
16年4月21日在15:19

Xrunjdwp是否已弃用(或删除了?)为什么我们要选择agentlib:jdwp?

–ArtOfWarfare
16年4月29日在17:08

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

–亚历山大·杜宾斯基(Aleksandr Dubinsky)
16年5月30日在13:47

#3 楼

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

对于远程调试,应运行以下地址为*:的程序:

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


评论


只是说明一下:Oracle链接说这将实现相同的旧行为,但是它并不安全,因此不建议这样做。

–灿硕哦
19 Mar 7 '19 at 18:41

#4 楼

对于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

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


address指定允许调试的端口

Maven

** Debug Spring使用Maven启动应用程序:

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


#6 楼

这是最简单的解决方案。

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

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

#7 楼

命令行

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


Gradle

gradle bootrun --debug-jvm


Maven

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


#8 楼

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


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

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