Yes, that's it. If one SIGQUIT has been processed, the JVM has already created 
the necessary handshake file and the attach will proceed regardless of the 
SIGQUIT reaching the JVM or not.

Thanks!
/Staffan

On 27 aug 2013, at 10:43, Mikael Gerdin <mikael.ger...@oracle.com> wrote:

> 
> 
> On 2013-08-27 10:26, Staffan Larsen wrote:
>> 
>> On 26 aug 2013, at 20:19, Martin Traverso <mtrave...@gmail.com
>> <mailto: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.
> 
> I think SIGQUIT is only used to initiate the attach mechanism. If the JVM can 
> catch the SIGQUIT before the verification error has occurred then the attach 
> mechanism will have been initialized and subsequent jstack/jcmd commands can 
> be processed.
> 
> /Mikael
> 
>> 
>> /Staffan
>> 
>>> 
>>> Martin
>>> 
>>> 
>>> On Mon, Aug 26, 2013 at 5:31 AM, Staffan Larsen
>>> <staffan.lar...@oracle.com <mailto: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 <mailto: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
>>>>    <mailto: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
>>>> 
>>> 
>>> 
>> 

Reply via email to