gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:53 24 4
gpt4 key购买 nike

我使用以下 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 内部或外部的调试端口,这样我就可以将其记录在状态管理服务器中。

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

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

最佳答案

从虚拟机内部:

    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 - 识别 Java jdwp 调试器分配的(临时)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com