如何让 Eclipse 远程调试器继续监听端口,直到 JVM 最终连接?
Posted
技术标签:
【中文标题】如何让 Eclipse 远程调试器继续监听端口,直到 JVM 最终连接?【英文标题】:How to have Eclipse Remote Debugger keep listening on port until a JVM finally connects? 【发布时间】: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 这是我一直在寻找的答案。效果很好。
【参考方案1】:
将评论转化为以后来的人的答案:
可以在-Xrunjdwp
开关中指定server=n
并让被调试者作为客户端连接到调试器服务器。
为了使这个工作,调试器配置应该使用 Eclipse 中的“Socket Listen”选项设置,如下所示:
然后可以通过以下方式启动客户端:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,suspend=n,address=8000 -jar foo.jar
或类似的。
【讨论】:
添加来自@Nicholas 的拒绝编辑作为评论,因为它似乎相关:缺点:如果 JVM2 被触发,然后被终止,然后再次触发,您将收到一条错误消息没有服务器监听要连接的端口 8000。另一种可能性是将您的应用程序保留为server=y
,但添加suspend=y
,它告诉JVM 在启动程序之前等待您以附加模式连接Eclipse。这将使得当第二个 JVM 最终运行时,它将等待远程调试器在启动之前连接。
我最初的问题来自需要在等待很长时间后调试一个程序,然后再重新运行该程序 3 次。所以是的,它是相关的以上是关于如何让 Eclipse 远程调试器继续监听端口,直到 JVM 最终连接?的主要内容,如果未能解决你的问题,请参考以下文章
tomcat开发远程调试端口以及利用eclipse进行远程调试