Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Identify Java jdwp Debugger Assigned (Ephemeral) Port

I am using the following JVM parameters to start-up a JVM with the hostpot debugger.

-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0

Note that I am assigning port zero, so that the JVM asks the OS for an ephemeral port. This is critical for my use-case, to make sure the JVM will not fail to start-up due to contention for some pre-defined port.

As a result my JVM starts-up, and the following log entry is outputted to stdout:

Listening for transport dt_socket at address: XXXX

I would like to find some way to identify the debug port from inside or outside of the JVM, so it would be possible for me to record it in a state management serverice.

What options are available for this use-case? I have considered the following, with little joy:

  • JMX Connector - Connect using JConsole to the process, find some MBean which details which port was use. However, I cannot find any such MBean
  • RMI Registry - Is it possible to have the debug agent register itself against an RMI Registry? I've not found any evidence this could work.
  • Java Agent - Specify a JVM agent that could intercept some aspect of the debugger and obtain the port details, again no evidence to support the feasibility of this idea.
like image 854
jwa Avatar asked Feb 26 '15 14:02

jwa


1 Answers

From within VM:

    Properties props = sun.misc.VMSupport.getAgentProperties();
    System.out.println(props.getProperty("sun.jdwp.listenerAddress"));

From outside application:

    VirtualMachine vm = com.sun.tools.attach.VirtualMachine.attach(PID);
    try {
        Properties props = vm.getAgentProperties();
        System.out.println(props.getProperty("sun.jdwp.listenerAddress"));
    } finally {
        vm.detach();
    }

Both are not a part of a standard. Applicable only to OpenJDK / Oracle JDK.

like image 65
apangin Avatar answered Sep 20 '22 04:09

apangin