簡體   English   中英

識別Java jdwp Debugger Assigned(Ephemeral)端口

[英]Identify Java jdwp Debugger Assigned (Ephemeral) Port

我使用以下JVM參數來啟動主機調試程序的JVM。

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

請注意,我正在分配端口零,以便JVM向操作系統請求臨時端口。 這對我的用例至關重要,以確保JVM不會因為某些預定義端口的爭用而無法啟動。

結果我的JVM啟動,並將以下日志條目輸出到stdout

Listening for transport dt_socket at address: XXXX

我想找到一些方法來識別JVM內部或外部的調試端口,因此我可以將它記錄在狀態管理服務器中。

這個用例有哪些選擇? 我已經考慮了以下幾點,但沒什么樂趣:

  • JMX Connector - 使用JConsole連接到進程,找到一些詳細說明使用哪個端口的MBean。 但是,我找不到任何這樣的MBean
  • RMI注冊表 - 是否可以讓調試代理自己注冊RMI注冊表? 我沒有找到任何可行的證據。
  • Java代理 - 指定可以攔截調試器某些方面並獲取端口詳細信息的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。

也許你可以開始的東西。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM