406

I know there's some JAVA_OPTS to set to remotely debug a Java program.

What are they and what do they mean ?

Gama11
34.6k9 gold badges92 silver badges107 bronze badges
asked Sep 26, 2008 at 9:47

9 Answers 9

532

Before Java 5.0, use -Xdebug and -Xrunjdwp arguments. These options will still work in later versions, but it will run in interpreted mode instead of JIT, which will be slower.

From Java 5.0, it is better to use the -agentlib:jdwp single option:

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

Options on -Xrunjdwp or agentlib:jdwp arguments are :

  • transport=dt_socket : means the way used to connect to JVM (socket is a good choice, it can be used to debug a distant computer)
  • address=8000 : TCP/IP port exposed, to connect from the debugger (will only allow local connections, see Antony Shumskikh's answer for remote debugging)
  • suspend=y : if 'y', tell the JVM to wait until debugger is attached to begin execution, otherwise (if 'n'), starts execution right away.
sleske
84k40 gold badges196 silver badges238 bronze badges
answered Oct 6, 2008 at 7:19
Sign up to request clarification or add additional context in comments.

5 Comments

Your are exactly correct.. I tried with -Xdebug and -Xrunjdwp but It didn't work. when I tried with -Xrunjdwp or agentlib:jdwp It is working. ( on Java 7 )
This only worked for me when I put quotes around it, otherwise I got this error: ERROR: JDWP Non-server transport dt_socket server=y suspend=y address=8000 must have a connection address specified through the 'address=' option
Is Xrunjdwp deprecated (or removed?) why would we pick agentlib:jdwp over it?
I think you're wrong. Netbeans uses -Xdebug -Xrunjdwp when debugging Maven projects, and they run like they're JITed.
[ERROR] No plugin found for prefix '.run.jvmArguments=-Xdebug -agentlib'
390

I have this article bookmarked on setting this up for Java 5 and below.

Basically run it with:

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

For Java 5 and above, run it with:

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

If you want Java to wait for you to connect before executing the application, replace suspend=n with suspend=y.

izogfif
7,8952 gold badges39 silver badges34 bronze badges
answered Sep 26, 2008 at 9:50

4 Comments

Worth to mention is that you might want to configure your address like *:1044 to enable remote debugging from any computer
HerrDerb is right.. Since Java 9 "address=1044" is not always listening on all interfaces. "address=*:1044" makes Java 9+ behave like Java 8...
Just a note: It is not required to add the address parameter. If not provided the agent is selecting a random port number. This might be useful if you start multiple nodes within the same java command line.
its also safer to use address=localhost:<debug port> vs just selecting the port
125

Since Java 9.0 JDWP supports only local connections by default. https://www.oracle.com/java/technologies/javase/9-all-relnotes.html#JDK-8041435

For remote debugging one should run program with *: in address:

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

Caution: this allows anyone who can reach the specified port (here 8000) on any of the machine's IP addresses to control the process, which is exactly why it's no longer the default.

SamB
9,2825 gold badges51 silver badges57 bronze badges
answered Jan 23, 2018 at 8:17

4 Comments

Just making a note: the Oracle link says this will achieve the same old behavior, but it is not secure and not recommended.
Yeah, I wasted some days to find this answer for docker-compose, docker swarm debug remote with inteliji, just do exactly(with *:): address=*:5005
In general I think it would be better (more secure, and generally better practice) to bind the port to localhost, and set up an ssh tunnel.
14

For java 1.5 or greater:

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

For java 1.4:

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

For java 1.3:

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

Here is output from a simple program:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled
answered Oct 28, 2016 at 13:34

Comments

10

java

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

address specifies the port at which it will allow to debug

Maven

**Debug Spring Boot app with Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"
BuZZ-dEE
7,11316 gold badges75 silver badges105 bronze badges
answered Mar 30, 2018 at 6:28

Comments

4

Command Line

-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
BuZZ-dEE
7,11316 gold badges75 silver badges105 bronze badges
answered Feb 25, 2019 at 11:15

Comments

3

Here is the easiest solution for maven builds.

There are a lot of environment special configurations needed if you are using Maven. So, if you start your program from maven, just run the mvnDebug command instead of mvn, it will take care of starting your app with remote debugging configurated. Now you can just attach a debugger on port 8000.

It'll take care of all the environment problems for you.

answered Sep 20, 2017 at 18:38

Comments

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

Here we just use a Socket Attaching Connector, which is enabled by default when the dt_socket transport is configured and the VM is running in the server debugging mode.

For more details u can refer to : https://stackify.com/java-remote-debugging/

mate00
2,9735 gold badges31 silver badges36 bronze badges
answered Jan 24, 2020 at 9:19

Comments

-2

If you are using java 9 or higher, to remotely debug (which is also the case when you use docker at local) you have to provide --debug *:($port). Because from java 9 --debug ($port) will only allow to debug at local, not remotely.

So, you can provide command in docker-compose like command: -- /opt/jboss/wildfly/bin/standalone.sh --debug *:8787

answered Nov 18, 2021 at 7:02

1 Comment

That --debug doesn't appear to be a JVM flag but rather a flag for standaone.sh, so this answer isn't helpful to other users as written.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.