28

I get AttachNotSupportedException while running jmockit tests on linux (ubuntu 64bit). Java version is 1.7.0_51. This JDK is from Oracle. Tests are run using ant(that probably is not relevant)

See the stack trace.

[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 

It appears to be related to AttachNotSupportedException while running jMockit tests on IBM JRE. This however is on IBM jre.

2

7 Answers 7

60

I had the same issue while I was trying to dump threads using jcmd. I was getting same error message even though I was running jcmd under the root user.

You need to run jcmd <pid> Thread.print under the same user as java process has, otherwise your connections will be dropped. Java doesn't care if you are root or not.

So basically:

sudo -u <java_process_user> jcmd <pid> Thread.print 
Sign up to request clarification or add additional context in comments.

3 Comments

Thank you. This was exactly what I was looking for. However, with Thread.dump I get the following error java.lang.IllegalArgumentException: Unknown diagnostic command. I had to use Thread.print.
+100 THANK YOU VERY MUCH
still facing the issue on java 8 (1.8.0_192).
36

Work around for now.

Adding '-XX:+StartAttachListener' to jvm argument fixed the issue.

A similar issue is discussed here at https://code.google.com/p/jmockit/issues/detail?id=136 and http://mail.openjdk.java.net/pipermail/macosx-port-dev/2013-October/006098.html (which talks about a possible regression in jdk7 build)

2 Comments

Apparently, it's a bug in the Attach API implementation in this version of the Oracle JRE for Linux. It's likely already fixed in 1.7.0_60 and above.
This was actually still an issue for me in 1.8.0_131 on Linux
6

Like @bbarker, I got the same error but on JDK 1.8.0_161 using the Linux subsystem in Windows 10 ("Bash on Ubuntu on Windows"). Configuring the Surefire plugin with the JVM argument mentioned above fixed the issue for me as well:

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

Running the tests from a "normal" Windows command prompt works without the above, though.

Comments

1

In my case, I have tomcat9 running as a system service (managedby systemd). Then, I need to do like below:

the issue is due to

/etc/systemd/system/multi-user.target.wants/tomcat9.service 

has PrivateTmp=yes

hence, the pid file is created in private folder in /tmp like this

/tmp/systemd-private-7f6b4999adf04e82a776c41b6c6fa0c4-tomcat9.service-1ZW0Hg/tmp/.java_pid3856662

and no java tool can access to it.

So the easiest option is to set PrivateTmp=no then it will create pid in /tmp, e.g.

ls -la /tmp | grep '.java_pid' srw------- 1 tomcat tomcat 0 Jun 23 11:15 .java_pid3857180 

then can extract heap dump from:

sudo -u tomcat jcmd 3857180 GC.heap_dump /tmp/heapdump.hprof 3857180: Dumping heap to /tmp/heapdump.hprof ... Heap dump file created [39099431 bytes in 0.300 secs] 

Comments

0

I also got a similar problem when tried to check for Thread Deadlock. You can also use the command jcmd <PID> Thread.print to print the thread dump on the console and check if the program has a deadlock. You can check my answer with steps on Deadlock detection in Java

Comments

0

I got similar issue, in my case, changing JDK vendor from OPENJ9 to OPENJDK resolved the issue.

Comments

0

The -F option fixed this for me. jcmd -F Thread.print

Can use this as well: jmap -dump:live,format=b,file=heapdump.hprof -F

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.