【问题标题】:Unable to debug in Java with eclipse无法使用 Eclipse 在 Java 中进行调试
【发布时间】:2011-11-21 04:46:30
【问题描述】:

我正在尝试使用 Eclipse 作为 IDE 在我的机器上调试一个简单的 Java 应用程序。当我尝试通过进入 Debug Perspective 来调试应用程序时,我设置了一个断点并开始调试。几秒钟后,弹出如下窗口:

Launching unicodeRead has encountered a problem. Cannot connect to VM

控制台转储的消息如下:

ERROR: transport error 202: connect failed: Connection refused
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:708]
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)  

我该如何纠正这个问题?为什么会这样?

【问题讨论】:

  • 是否已经有另一个进程在调试模式下运行?端口可能正忙。
  • @JamesDW:我该如何检查?我没有打开任何其他调试器 (gdb/ddd)。
  • @JamesDW 可能他会得到ERROR: transport error 202: bind failed: Address already in use ,以防端口已经在使用中。
  • @Sriram 您使用哪些参数启动 jvm?
  • @XaviLópez:就 Java 而言,我完全是个菜鸟。我认为我没有特别提到任何参数。我只是点击构建和运行按钮来运行程序。如何检查我在运行 jvm 时使用了哪些参数?

标签: java eclipse debugging


【解决方案1】:

我也遇到了同样的问题。

昨天一切正常,现在什么都没有 - 与您给出的错误相同。我发现网络管理员在此期间进行了一些更改。一些防火墙的东西。问题是 Eclipse 试图在“localhost”(和一些随机端口)建立与 JVM 的连接。当我尝试 ping 本地主机(或 127.0.0.1)时,我得到了以下信息:

C:\Windows\system32>ping 127.0.0.1
Pinging 127.0.0.1 with 32 bytes of data:
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.

C:\Windows\system32>ping localhost
Ping request could not find host localhost. Please check the name and try again.

似乎在某些情况下,DNS 有望解决这个问题,如果防火墙阻止了对 DNS 的 localhost 请求 - 东西就会中断。我必须在以下几行中更改主机文件并删除 cmets,因此我不再依赖 DNS:

# 127.0.0.1       localhost
# ::1             localhost

虽然写的是hosts文件更改立即生效,但我认为某些进程锁定了它并在我的情况下需要重新启动。之后,一切都恢复正常了。

【讨论】:

  • 我在 OS X 10 中遇到了这个问题。我注意到我的主机文件中有第二个 localhost 条目指向我的 LAN 地址。删除第二个条目解决了我的问题(但如果不运行 ping,我永远不会注意到它!)
  • 为我工作。无需重新启动。谢谢!
  • 它对我有用,我在主机文件中删除了重复的本地主机,仅此而已。
  • 我正在使用 Intellij,当我使用“Platform test runner”时调试器工作得很好,但是当我使用“gradle test runner”进行调试时,我得到了相同的错误代码。我试过重启,杀死java进程,防火墙关闭并ping localhost,127.0.0.1和::1都可以访问。没有一个解决方案对我有用。还有其他成功的解决方案吗?
  • 我也面临同样的问题。唯一值得注意的是,它仅在我连接到我们公司的网络时才会发生。当我连接到其他网络时,调试工作正常。有什么解决问题的建议吗?
【解决方案2】:

我在使用 -X 格式时看到一个错误:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

当我切换到较新的格式时,错误消失了:

java -agentlib:jdwp=transport=dt_socket,server=y,address=4000,suspend=n myapp

【讨论】:

    【解决方案3】:

    看起来与here 的问题相同。重新启动电脑解决了那里的问题。我还没有找到任何其他解决方案。

    【讨论】:

      【解决方案4】:

      遇到了同样的问题,但解决方案是使用-server=y 选项而不是-server=n 运行应用程序。

      之前:

      java -agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=localhost:5005 
      

      之后:

      java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5005
      

      【讨论】:

      • 这为我解决了这个问题。值得注意的是,服务器似乎默认为 n,因为我根本没有设置服务器。
      【解决方案5】:

      非常简单,只需在 eclipse.ini 文件中进行以下更改即可。

      -vm
      binary\com.sun.java.jdk.win32.x86_1.6.0.u43\jre\bin\javaw.exe
      

      【讨论】:

      • 不知道为什么,但它可以使用它并将 JDK 1.7 设置为 JRE。
      【解决方案6】:

      我变了

      -agentlib:jdwp=transport=dt_socket,address=9009,server=n,suspend=y
      

      -agentlib:jdwp=transport=dt_socket,address=9009,server=y,suspend=n
      

      这就成功了!

      【讨论】:

        【解决方案7】:

        我的情况是我有一堆域在 hosts 文件中引用 127.0.0.1,如下所示:

        127.0.0.1 localhost domian1.local domain2.local domain3.local

        有一天,我添加了另一个新域来引用 127.0.0.1。错误地,我将域放在“localhost”前面,如下所示:

        127.0.0.1 domain4.local localhost domian1.local domain2.local domainx.local

        在这之后,我在调试时总是在eclipse中得到一个警告窗口:

        无法连接到虚拟机 com.sun.jdi.connect.TransportTimeoutException

        在控制台中:

        错误:传输错误 202:连接失败:连接被拒绝 错误:JDWP:无法通过 localhost:50470 初始化传输,尝试通过 127.0.0.1:50470 进行 localhost 本机方法中的致命错误:JDWP 未初始化传输,jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197) 错误:传输错误 202:连接失败:连接被拒绝 错误:JDWP 传输 dt_socket 初始化失败,TRANSPORT_INIT(510) JDWP 退出错误 AGENT_ERROR_TRANSPORT_INIT(197):没有传输初始化 [../../../src/share/back/debugInit.c:690]

        解决办法是把“localhost”一直放在第一位。

        127.0.0.1 localhost domian1.local domain2.local domainx.local domain4.local

        【讨论】:

          【解决方案8】:

          为我解决的问题是删除 glassfish 主文件夹中 domain1 文件夹中的整个 domain1 文件夹。 Eclipse 会要求您重新创建一个域,然后一切都会恢复正常。

          【讨论】:

            【解决方案9】:

            由于 /etc/hosts 文件的故障,我在我的 ubuntu 机器上遇到了同样的错误。我已经注释掉了 localhost 到 127.0.0.1 的映射,更复杂的是,还有一个交换文件。

            这是我的 /etc/hosts 的第一行:

            127.0.0.1       #localhost
            

            删除 # 解决了问题,但可以理解的是重新启动没有。

            【讨论】:

            • 这是评论而非答案。
            【解决方案10】:

            我的原因和解决方案完全不同。
            我认为就我而言,这是由于安装了 JProfiler。我通过卸载 JProfiler 并使用 -clean 选项启动 eclipse 来修复它。我怀疑 JProfiler 正在将自己插入调试器中。 -clean 选项强制 Eclipse 重新评估其插件,因此仅此一项可能就足够了。

            【讨论】:

              【解决方案11】:

              继续@gonadarian 的回答,似乎Eclipse 使用端口127.0.0.1 进行调试。此端口也称为localhost。消除此错误的方法是确保上述端口上没有运行任何进程或服务。在 Linux 上执行此操作的方法是:

              1. 作为root,输入命令:
                netstat -tulpn | grep 127.0.0.1

              2. 如果有进程在上述端口上运行,它将以格式显示:
                process_id/process name

              3. 像这样杀死上述进程:kill -KILL process_id

              4. 重新启动计算机以使这些更改生效。该错误应该不再发生。

              【讨论】:

              • 这是我读过的最错误和最矛盾的答案。
              • @Qix:为什么会这样?
              • 让我们看看; 127.0.0.1 不是端口。 localhost 也不是。进程和服务不会“在”端口上“运行”,它们会租用端口。此外,在杀死进程后重新启动计算机是徒劳的,因为如果愿意,该进程将重新启动。如果杀死它有效并且它不是启动过程,那么重新启动将肯定解决问题。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-04-06
              • 2013-01-04
              • 2015-01-18
              • 1970-01-01
              • 2018-10-01
              • 1970-01-01
              相关资源
              最近更新 更多