识别Java jdwp调试器分配的(临时)端口

我正在使用以下JVM参数通过hostpot调试器启动JVM。

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

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

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

Listening for transport dt_socket at address: XXXX

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

此用例有哪些可用选项?我已经考虑了以下内容,有些不高兴:

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

回答:

从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。

以上是 识别Java jdwp调试器分配的(临时)端口 的全部内容, 来源链接: utcz.com/qa/410883.html

回到顶部