com.sun.tools.attach.AttachNotSupportedException: 无法打开套接字文件:目标进程未响应或未加载HotSpot VM

26

我在Linux(Ubuntu 64位)上运行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

这似乎与在IBM JRE上运行jMockit测试时出现的AttachNotSupportedException有关。然而,这是在IBM jre上。


1
有一个很好的答案:https://dev59.com/GF8e5IYBdhLWcg3wEG_A - gavenkoa
在我的情况下,这是由于使用与拥有运行进程的用户不同的用户启动jcmd。其中一个案例描述在https://dev59.com/GF8e5IYBdhLWcg3wEG_A#35963059中。 - Mariano Paniga
5个回答

59

当我尝试使用jcmd转储线程时,我遇到了同样的问题。即使我以root用户身份运行jcmd,我仍然收到相同的错误消息。

您需要在与Java进程相同的用户下运行jcmd <pid> Thread.print,否则您的连接将被断开。Java无论您是root还是其他用户都不会关心

基本上:

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

2
谢谢。这正是我在寻找的东西。但是,使用 Thread.dump 我得到以下错误 java.lang.IllegalArgumentException: Unknown diagnostic command。我不得不使用 Thread.print - egelev
+100 THANK YOU VERY MUCH - Brent Writes Code
仍然在Java 8(1.8.0_192)上遇到问题。 - SUMIT

32

2
显然,这是Oracle JRE for Linux中Attach API实现版本的一个错误。很可能已经在1.7.0_60及以上版本中修复了。 - Rogério
17
在Linux上,1.8.0_131版本对我来说仍然存在这个问题。 - bbarker

6

像@bbarker一样,我在使用Windows 10上的Linux子系统(“Bash on Ubuntu on Windows”)时遇到了同样的错误,但是在JDK 1.8.0_161上。与上述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命令提示符中运行测试是可以的,不需要上述条件。


0

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


0

当我尝试检查线程死锁时,我也遇到了类似的问题。你可以使用命令jcmd <PID> Thread.print在控制台上打印线程转储,并检查程序是否有死锁。你可以查看我在Java中的死锁检测中的步骤来核对我的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接