【发布时间】:2010-04-16 20:12:47
【问题描述】:
我想使用命令行调试器连接到由 eclipse 启动的 java 进程,但不确定 eclipse 启动的 java 进程的默认属性是什么?我不介意使用套接字进行附加,但不确定会慢多少?
【问题讨论】:
我想使用命令行调试器连接到由 eclipse 启动的 java 进程,但不确定 eclipse 启动的 java 进程的默认属性是什么?我不介意使用套接字进行附加,但不确定会慢多少?
【问题讨论】:
怎么样
-Xdebug -Xnoagent -agentlib:jdwp=transport=dt_socket,suspend=n,address=localhost:12345
然后您可以将 java 调试器附加到端口 12345
【讨论】:
我研究了 Eclipse 中“运行”和“调试”之间 Java 应用程序启动的差异。我使用 Sysinternals 的 Process Explorer 来查看 Eclipse 在使用任一选项启动 Java 应用程序时分叉的 Java 进程的命令行。 (我在 Windows 7 系统上)
使用“运行 HelloWorld”
"C:\Program Files (x86)\Java\jdk1.7.0_07\jre\bin\javaw.exe" -Dfile.encoding=Cp1252 -classpath C:\workspace-juno\HelloWorld\bin com.example.HelloWorld
.......
使用“调试 HelloWorld”
"C:\Program Files (x86)\Java\jdk1.7.0_07\jre\bin\javaw.exe" -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:2404 -Dfile.encoding=Cp1252 -classpath C:\workspace-juno\HelloWorld\bin com.example.HelloWorld
(地址端口在后续调用中发生了变化,例如在下一次调用时变为address=localhost:2564。)
因此,java(或 javaw)实际上以不同的选项启动,具体取决于使用的是“运行”还是“调试”:“调试”启动添加了一个额外的 agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:NNNN 选项。这是将 JVM 置于可调试模式的标准方法。 HelloWorld 程序将首先等待其调试器成功连接到它,然后再继续(选项suspend=y)。 HelloWorld JVM 将自动连接到在地址 localhost:NNNN 上运行的某个调试器(...选项address=localhost:NNNN 和隐式默认选项server=n)。 (...Oracle provides authoritative information on the agentlib start-up options)
Eclipse 本身将充当提供端口 NNNN 的调试器应用程序。 HelloWorld JVM 将通过其自己的编号为 NNNN+1 的端口连接到此端口(可以使用进程资源管理器在该进程的 TCP/IP 选项卡上查看进程使用的端口)。
【讨论】: