【问题标题】:com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loadedcom.sun.tools.attach.AttachNotSupportedException:无法打开套接字文件:目标进程没有响应或 HotSpot VM 未加载
【发布时间】:2014-10-15 20:00:21
【问题描述】:

我在 linux (ubuntu 64bit) 上运行 jmockit 测试时收到AttachNotSupportedException。 Java 版本为 1.7.0_51。这个 JDK 来自 Oracle。使用 ant 运行测试(可能不相关)

查看堆栈跟踪。

[junit] 
[junit] java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit]     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit]     at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit]     at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit]     at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit]     at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit]     at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit]     at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit]     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit]     ... 8 more
[junit] Exception in thread "main" java.lang.ExceptionInInitializerError
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit]     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit]     at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit]     at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit]     at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit]     at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit]     at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit]     ... 3 more
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit]     at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit]     at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit]     ... 8 more
[junit] Running chs.caf.cap

它似乎与AttachNotSupportedException while running jMockit tests on IBM JRE 有关。然而,这是在 IBM jre 上。

【问题讨论】:

标签: linux java-7 jmockit


【解决方案1】:

我的回答会有点无关紧要,但我在尝试使用 jcmd 转储线程时遇到了同样的问题。即使我在 root 用户下运行 jcmd,我也会收到相同的错误消息。

您需要在与java进程相同的用户下运行jcmd &lt;pid&gt; Thread.print ,否则您的连接将被丢弃。 Java 不在乎你是否是 root

所以基本上:

sudo -u <java_process_user> jcmd <pid> Thread.print

【讨论】:

  • 谢谢。这正是我想要的。但是,使用Thread.dump 我收到以下错误java.lang.IllegalArgumentException: Unknown diagnostic command。我不得不使用Thread.print
  • +100 非常感谢
【解决方案2】:

我遇到了类似的问题,在我的情况下,将 JDK 供应商从 OPENJ9 更改为 OPENJDK 解决了这个问题。

【讨论】:

    【解决方案3】:

    我在尝试检查线程死锁时也遇到了类似的问题。也可以使用命令jcmd &lt;PID&gt; Thread.print在控制台打印线程转储,检查程序是否有死锁。您可以通过Deadlock detection in Java上的步骤查看我的答案

    【讨论】:

      【解决方案4】:

      与@bbarker 一样,我遇到了同样的错误,但在 JDK 1.8.0_161 上使用 Windows 10 中的 Linux 子系统(“Windows 上的 Ubuntu 上的 Bash”)。使用上面提到的 JVM 参数配置 Surefire 插件也为我解决了这个问题:

          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.21.0</version>
              <configuration>
                  <argLine>-XX:+StartAttachListener</argLine>
              </configuration>
          </plugin>
      

      不过,从“正常”的 Windows 命令提示符运行测试可以在没有上述条件的情况下工作。

      【讨论】:

        【解决方案5】:

        暂时解决。

        '-XX:+StartAttachListener' 添加到 jvm 参数解决了这个问题。

        https://code.google.com/p/jmockit/issues/detail?id=136http://mail.openjdk.java.net/pipermail/macosx-port-dev/2013-October/006098.html 讨论了类似的问题(讨论了 jdk7 构建中可能的回归)

        【讨论】:

        • 显然,这是该版本的 Oracle JRE for Linux 中的 Attach API 实现中的一个错误。它可能已经在 1.7.0_60 及更高版本中修复。
        • 在 Linux 上的 1.8.0_131 中这对我来说实际上仍然是一个问题
        猜你喜欢
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 2013-02-24
        • 2013-07-13
        • 1970-01-01
        • 2011-11-17
        相关资源
        最近更新 更多