RFR: JDK-8215550: Debugger does not work after reattach

Gary Adams gary.adams at oracle.com
Wed Jan 30 16:24:34 UTC 2019


Following the trail from debugLoop_run, at the bottom of the loop
there is a path through debugInit_reset that involves eventHandler_reset
and eventually eventHelper_reset. This seems like a better place to
clear the flag back to original state.

   Revised webrev: http://cr.openjdk.java.net/~gadams/8215550/webrev.01/

On 1/29/19, 6:11 PM, Chris Plummer wrote:
> Ok, so you can't do a "cont" because threads are not suspended. That 
> means someone resumed them. When/where was this done?
>
> Regarding threadIDs changing, my guess is that debugLoop_run() is 
> re-entered when the new connection is established. This will result in 
> commonRef_reset() being called, which invalidates all reference IDs, 
> including threadIDs. So the first time the agent needs to send a 
> threadID to the debugger, it needs to create a new one.
>
> Chris
>
> On 1/29/19 1:52 PM, gary.adams at oracle.com wrote:
>> Issuing a "cont" in the second session does not work, because
>> the threads are not suspended.
>>
>> It's interesting that the thread ids have all changed in
>> the reconnected session.
>>
>> ...
>>
>> main[1] threads
>> Group system:
>>   (java.lang.ref.Reference$ReferenceHandler)0x374 Reference Handler 
>> running
>>   (java.lang.ref.Finalizer$FinalizerThread)0x375 Finalizer cond. waiting
>>   (java.lang.Thread)0x376                         Signal Dispatcher 
>> running
>> Group main:
>>   (java.lang.Thread)0x1 main              running (at breakpoint)
>> Group InnocuousThreadGroup:
>>   (jdk.internal.misc.InnocuousThread)0x377 Common-Cleaner    cond. 
>> waiting
>> main[1] exit
>> ...
>> > threads
>> Group system:
>>   (java.lang.ref.Reference$ReferenceHandler)0x3b2 Reference Handler 
>> running
>>   (java.lang.ref.Finalizer$FinalizerThread)0x3b3 Finalizer cond. waiting
>>   (java.lang.Thread)0x3b4                         Signal Dispatcher 
>> running
>> Group main:
>>   (java.lang.Thread)0x3b7 main              running
>> Group InnocuousThreadGroup:
>>   (jdk.internal.misc.InnocuousThread)0x3b8 Common-Cleaner    cond. 
>> waiting
>> > cont
>> > Nothing suspended.
>>
>>
>>
>>
>>
>>
>> On 1/29/19 2:27 PM, Chris Plummer wrote:
>>> What is the state of the threads after the detach? If they are all 
>>> automatically resumed by the agent, then I think the unblocking 
>>> should be done by the same code that resumes the threads. If they 
>>> are still suspended, then why would we want to unblock when the next 
>>> connection comes in? It should be up to the debugger to detect that 
>>> all threads are suspended and act accordingly.
>>>
>>> Also, what happens if after attaching again you issue a "cont" command?
>>>
>>> Chris
>>>
>>> On 1/29/19 9:55 AM, Gary Adams wrote:
>>>> As far as I can tell, the quit and exit commands are only handled 
>>>> locally
>>>> on the debugger side of the connection. There is no packet sent to the
>>>> libjdwp agentlib.
>>>>
>>>> On 1/29/19, 12:17 PM, Chris Plummer wrote:
>>>>> Hi Gary,
>>>>>
>>>>> When the "exit" or "quit" is done, aren't all threads resumed at 
>>>>> that point, and shouldn't that result in the command loop being 
>>>>> unblocked?
>>>>>
>>>>> thanks,
>>>>>
>>>>> Chris
>>>>>
>>>>> On 1/29/19 8:09 AM, Gary Adams wrote:
>>>>>> Significant protections are put in place to protect the commandLoop
>>>>>> from multiple events that that have a suspend-all policy. The
>>>>>> commandLoop uses a special block variable to ensure only
>>>>>> a VirtualMachine or ThreadReference call to resume() will unblock
>>>>>> the commandLoop. See
>>>>>>
>>>>>>   src/jdk.jdwp.agent/share/native/libjdwp/eventHelper.c
>>>>>>
>>>>>> In this particular bug report, the user was stopped at a breakpoint
>>>>>> when they sent the "exit" command. The same effect can be produced
>>>>>> with a "quit" command or any killing of the debugger process.
>>>>>>
>>>>>> When the second session is started the commandLoop is still blocked,
>>>>>> so a new breakpoint will never be dequeued from the commandQueue.
>>>>>>
>>>>>> The proposed workaround will ensure the commandLoop is unblocked
>>>>>> when a new session is started.
>>>>>>
>>>>>>   Issue: https://bugs.openjdk.java.net/browse/JDK-8215550
>>>>>>   Webrev: http://cr.openjdk.java.net/~gadams/8215550/webrev.00/
>>>>>>
>>>>>> All testing has been done by manually replicating the reported
>>>>>> command sequences. I'll see if an existing breakpoint test can be
>>>>>> enhanced to cover this scenario.
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
>



More information about the serviceability-dev mailing list