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

它们是什么?它们的含义是什么?


当前回答

我收藏了这篇为Java 5及以下版本设置的文章。

基本上运行它:

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

对于Java 5及以上版本,使用以下命令运行:

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

如果您希望Java在执行应用程序之前等待您连接,请将suspend=n替换为suspend=y。

其他回答

因为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

这是最简单的解决办法。

如果您正在使用Maven,则需要许多环境专用配置。所以,如果你从maven启动你的程序,只需运行mvnDebug命令而不是mvn,它将负责启动你的应用程序配置远程调试。现在可以在端口8000上附加调试器。

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

对于java 1.5或更高版本:

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

对于java1.4:

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

对于java1.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
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

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

更多详情请参考:https://stackify.com/java-remote-debugging/

命令行

-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