【发布时间】:2014-10-13 03:33:17
【问题描述】:
我有一个包含多个不同 JVM 的复杂应用程序。
JVM 1 做了大约 5 分钟的工作,然后启动另一个 JVM2 来做一些额外的工作。
我想调试 JVM2。于是我在JVM2的启动脚本上开启了一个远程socket调试器:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
然后我像这样设置我的 Eclipse 远程调试会话:
连接类型:标准(Socket Attach),主机:localhost,端口:8000
如果我等待 JVM2 启动,然后启动调试器,它工作正常。
但是,在等待了 5 分钟之后,很难集中注意力来单击调试器。
如果我在 JVM2 开启之前启动远程调试器...我得到
Failed to connect to remote VM. Connection refused.
Connection refused: connect
有没有办法让远程调试器不断尝试连接?
我尝试使用 Eclipse 远程调试连接类型:Socket Listen,但这会阻塞端口,并且 JVM2 在启动时会出现此错误:
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ERROR_INTERNAL(113)
ERROR: transport error 202: bind failed: Address already in use ["transport.c",L41]
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) ["debugInit.c",L500]
JDWP exit error JVMTI_ERROR_INTERNAL(113): No transports initialized
如何让远程调试器反复尝试?
【问题讨论】:
-
这是远程调试的工作方式。连接从调试器到被调试的远程 JVM。如果您愿意,可以添加
suspend=y选项以使远程JVM 暂停,直到调试器连接。远程 JVM 不会启动传出 JDWP 连接。 -
我根本不是这方面的专家,但是是否可以在
-Xrunjdwp开关中指定server=n并让被调试者作为客户端连接到调试器服务器,根据您的eclipse 中的第二个设置(“Socket Listen”)? -
@JimGarrison 我现在正在尝试。
-
@msandiford 我接下来会尝试你的建议。出于某种原因,IE8(我一直在工作中使用)直到现在才向我显示您的评论。这听起来像是另一个可以接受的答案。你们两个人的cmets都非常有效。
-
@msandiford 这是我一直在寻找的答案。效果很好。