Explain Codes LogoExplain Codes Logo

Remote debugging a Java application

java
remote-debugging
jvm-options
debugging-parameters
Alex KataevbyAlex Kataev·Aug 30, 2024
TLDR

To enable remote debugging in your Java application, use this JVM option:

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

The application will then act as a debug server on port 8000. The transport=dt_socket flag indicates the use of TCP/IP for communication, while suspend=n ensures the application keeps running until a debugger connects.

Use your IDE debugger to connect to localhost:8000 (or to a different host, if debugging remotely). In IDEs like Eclipse or IntelliJ, you should create a remote debug configuration with these specifications. Also, ensure your firewall permits access to the chosen port for remote connections.

Using correct JVM options

Different versions of the JDK may necessitate changes to the JVM parameters for remote debugging. For JDK versions 1.4 or older, use:

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

From JDK 5.0 onwards, employ the simplified -agentlib:jdwp syntax:

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

When running the application, always position the debug options ahead of the class name or -jar in your Java command. Refer to the table below for a quick lookup:

JDK VersionOption String
1.3 & below-Xnoagent -Djava.compiler=NONE
1.4-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=4000,suspend=n
5.0 & above-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,suspend=n

Securing the remote debug sessions

Since enabling remote debugging opens up a potential exploit via an open port, it's crucial to consider the security ramifications:

  • Limit access to authorized networks or VPNs.
  • Enable TLS/SSL encryption for the debug sessions in production applications.
  • If permissible by your debugger, use SSH tunnels for port forwarding.

Troubleshooting connectivity issues

You may sometimes encounter connectivity issues despite having correctly set up remote debugging. Here are some quick troubleshooting tips:

  • Avoid including spaces within the jdwp option string.
  • Ensure both the Linux and Windows firewalls allow TCP traffic through the debugging port.
  • Verify that the machines hosting the application and the debugger are either on the same LAN or have effective routing rules set up.

Deep dive into debugging parameters

Adjusting the suspension mode

The suspend=n setting lets your application run uninterrupted post-launch. However, changing suspend to y makes JVM halt execution until a debugger connects.

Changing the port number

If the default port 8000 is in use or blocked, you can use an alternate port. Update the address=*:PORT setting accordingly.

Expanding knowledge base

For step-by-step instructions or more advanced debugging techniques, consult Oracle's remote debugging documentation and other reputable resources.

Profiling alongside debugging

Consider using a profiling tool such as VisualVM in conjunction with remote debugging. This combo enables you to glean deeper insights into your remotely debugged applications' performance and resource usage.