识别Java jdwp Debugger Assigned(Ephemeral)端口

时间:2015-02-26 14:31:10

标签: java jvm jvm-hotspot

我正在使用以下JVM参数来启动主机调试程序的JVM。

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

请注意,我正在分配端口0,以便JVM向操作系统请求临时端口。这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动。

结果我的JVM启动,并将以下日志条目输出到stdout

Listening for transport dt_socket at address: XXXX

我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中。

此用例有哪些可用选项?我已经考虑了以下几点,但没什么乐趣:

  • JMX Connector - 使用JConsole连接到进程,找到一些详细说明使用哪个端口的MBean。但是,我找不到任何这样的MBean
  • RMI注册表 - 是否可以让调试代理自行注册RMI注册表?我没有找到任何证据证明这可行。
  • Java代理 - 指定可以拦截调试器某些方面并获取端口详细信息的JVM代理,再次没有证据支持这种想法的可行性。

2 个答案:

答案 0 :(得分:9)

从VM内部:

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

来自外部申请:

    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();
    }

两者都不是标准的一部分。仅适用于OpenJDK / Oracle JDK。

答案 1 :(得分:0)

也许你可以开始。

netstat -tlnp

这将为您提供在本地TCP端口上侦听的所有进程的列表。例如:

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 

如果您需要更精细的Java进程粒度,可以使用ps来收集有关该进程的信息。

ps x -p 26733

可以返回类似

的内容

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