识别 Java jdwp 调试器分配的(临时)端口
Identify Java jdwp Debugger Assigned (Ephemeral) Port
我正在使用以下 JVM 参数通过 hostpot 调试器启动 JVM。
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
请注意,我正在分配端口零,以便 JVM 向 OS 请求临时端口。这对我的用例至关重要,以确保 JVM 不会因争用某些预定义端口而无法启动。
结果我的 JVM 启动了,下面的日志条目被输出到 stdout
:
Listening for transport dt_socket at address: XXXX
我想找到一些方法来识别 JVM 内部或外部的调试端口,这样我就可以将其记录在状态管理服务器中。
此用例有哪些选项可用?我考虑了以下内容,但并不高兴:
- JMX Connector - 使用 JConsole 连接到进程,找到一些 MBean,详细说明使用了哪个端口。但是,我找不到任何这样的 MBean
- RMI 注册表 - 是否可以让调试代理在 RMI 注册表中注册自己?我还没有找到任何这可行的证据。
- Java Agent - 指定一个 JVM 代理可以拦截调试器的某些方面并获取端口详细信息,同样没有证据支持这个想法的可行性.
也许你可以从什么开始。
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
可以 return 类似
26733 pts/1 0:00 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 Scratch
从虚拟机内部:
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.
我正在使用以下 JVM 参数通过 hostpot 调试器启动 JVM。
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
请注意,我正在分配端口零,以便 JVM 向 OS 请求临时端口。这对我的用例至关重要,以确保 JVM 不会因争用某些预定义端口而无法启动。
结果我的 JVM 启动了,下面的日志条目被输出到 stdout
:
Listening for transport dt_socket at address: XXXX
我想找到一些方法来识别 JVM 内部或外部的调试端口,这样我就可以将其记录在状态管理服务器中。
此用例有哪些选项可用?我考虑了以下内容,但并不高兴:
- JMX Connector - 使用 JConsole 连接到进程,找到一些 MBean,详细说明使用了哪个端口。但是,我找不到任何这样的 MBean
- RMI 注册表 - 是否可以让调试代理在 RMI 注册表中注册自己?我还没有找到任何这可行的证据。
- Java Agent - 指定一个 JVM 代理可以拦截调试器的某些方面并获取端口详细信息,同样没有证据支持这个想法的可行性.
也许你可以从什么开始。
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
可以 return 类似
26733 pts/1 0:00 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 Scratch
从虚拟机内部:
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.