Identify Java jdwp Debugger Assigned (Ephemeral) Port

折月煮酒 提交于 2019-12-30 05:03:10

问题


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.

回答1:


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.




回答2:


Maybe something you could start with.

netstat -tlnp

This gives you a list of all processes listening on a local TCP port. For example:

tcp    0    0 0.0.0.0:35688     0.0.0.0:*     LISTEN   26733/java
35688 - the ephemeral port
java  - the program name which is listening
26733 - the PID of the process 

If you need a finer granularity of the java processes you could use ps to gather informations about the process.

ps x -p 26733

could return something like

26733 pts/1 0:00 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 Scratch



来源:https://stackoverflow.com/questions/28745065/identify-java-jdwp-debugger-assigned-ephemeral-port

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!