On 26 aug 2013, at 20:19, Martin Traverso <mtrave...@gmail.com> wrote:
> Great! Thanks for the explanation. > > Just curious, why does running jstack at least once before the code reaches > that method call prevent the problem from happening at all? No idea. :( Can't figure it out. /Staffan > > Martin > > > On Mon, Aug 26, 2013 at 5:31 AM, Staffan Larsen <staffan.lar...@oracle.com> > wrote: > 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 >> > >