Here is what's happening: - The VM sets the signal mask for all threads (except the internal VMThread) to mask out SIGQUIT using pthread_sigmask(). So the process will still respond to SIGQUIT, but only one thread. - The verifier code calls setjmp() to save the calling context. On OS X this also saves the signal mask. - The example code causes a verification error somewhere which causes the verifier to call longjmp(). - longjmp will restore the signal mask using sigprocmask() which sets the signal mask for the _process_. - Now the process has a signal mask that masks out SIGQUIT and attach stops working.
This only happens on OS X because setjmp/longjmp does not save and restore the signal mask on other platforms. There are functions _setjmp/_longjmp on OS X to skip the signal mask save/restore and I think this is what we need to use in the verifier (also need to check other uses of setjmp/longjmp in the JDK). I have filed bug 8023720 for this. Thanks again for the report and reproducer. /Staffan On 23 aug 2013, at 14:44, Staffan Larsen <staffan.lar...@oracle.com> wrote: > Thanks for the excellent bugreport! > > I've had a quick look today but haven't yet figured out what the problem is. > What happens is that somehow the process becomes immune to the SIGQUIT that > jstack sends to it when it wants to attach. Instead of running jstack, one > can also do "kill -QUIT <pid>" and with this code no thread stacks are > printed (as they normally will be). > > I'll continue looking, > /Staffan > > On 23 aug 2013, at 07:20, Martin Traverso <mtrave...@gmail.com> wrote: > >> I have a program that causes jstack and jcmd to fail to attach to the JVM on >> OS X. Unfortunately, it uses a third-party library, so I'm not sure what's >> the magic incantation that causes this to happen. >> >> I wrote a small test case using this library that reproduces the problem. >> You can find the code here: https://github.com/martint/jstackissue. >> >> I've seen the problem on both 1.7.0_25-b15 and 1.8.0-ea-b100 on OS X, but >> not on Java 6. It doesn't seem to happen on Linux, either. >> >> One interesting data point is that if I run jstack before the code makes the >> call to the library, it works, and continues to work even after that call is >> complete. On the other hand, if run jstack for the first time *after* the >> call to the library, it won't work at all. >> >> Any ideas? >> >> Thanks! >> Martin >