如何让 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启动debug模式,使用eclipse远程调试

Eclipse远程调试(远程服务器端监听)

eclipse 远程 debug 调试

tomcat开发远程调试端口以及利用eclipse进行远程调试

windows下面的java项目打成jar放到XShell终端上面进行远程调试

eclipse里如何修改tomacat的端口号