Codereview request: 8007710 runtime/7158988/FieldMonitor.java fails with com.sun.jdi.VMDisconnectedException: Connection closed
shanliang
shanliang.jiang at oracle.com
Tue Feb 11 09:30:57 PST 2014
Here is the new fix in which FieldMonitor will write to
TestPostFieldModification, to inform the latter to quit, as suggested bu
Jaroslav
http://cr.openjdk.java.net/~sjiang/JDK-8007710/01/
Thanks,
Shanliang
shanliang wrote:
> shanliang wrote:
>> Jaroslav Bachorik wrote:
>>> On 11.2.2014 16:31, shanliang wrote:
>>>> Staffan Larsen wrote:
>>>>> Hi Shanliang,
>>>>>
>>>>> I can’t quite see how the test can fail in this way. When the
>>>>> ClassPrepareEvent happens, the debuggee will be suspended. So when
>>>>> addFieldWatch() is called, the debuggee should not have moved.
>>>> I am not expert of jdi so I may miss something here. I checked the
>>>> failure trace and saw the report exception happen when FieldMonitor
>>>> received ClassPrepareEvent and was doing addFieldWatch.
>>>> FieldMonitor did
>>>> call "vm.resume()" before treating events.
>>>
>>> AFAICS, calling vm.resume() results in an almost immediate debuggee
>>> death. The gc() invoking thread "d" is flagged as a deamon and as
>>> such doesn't prevent the process from exiting. The other thread is
>>> not a daemon but will finish in only few cycles.
>> I looked at the class com.sun.jdi.VirtualMachine, here is the Javadoc
>> of the method "resume":
>> /**
>> * Continues the execution of the application running in this
>> * virtual machine. All threads are resumed as documented in
>> * {@link ThreadReference#resume}.
>> *
>> * @throws VMCannotBeModifiedException if the VirtualMachine is
>> read-only - see {@link VirtualMachine#canBeModified()}.
>> *
>> * @see #suspend
>> */
>> void resume();
>> My understanding is that the debuggee resumes to work after this
>> call, instead to die?
> In fact the problem is here, the vm (TestPostFieldModification) should
> not die before FieldMonitor finishes addFieldWatch.
>
> Shanliang
>>>
>>>>
>>>> I reproduced the bug by add sleep(1000) after vm.resume() but before
>>>> calling eventQueue.remove();
>>>
>>> It looks like some kind of synchronization between the debugger and
>>> the debuggee is necessary. But I wonder if you should better use the
>>> process.getOuptuptStream() to write and flush a message for the
>>> debugee indicating that it can exit. And in the debugee you would
>>> just do System.in.read() as the last statement in the main() method.
>>> Seems more robust than involving files.
>> It could work, but creating a file in the testing directory should
>> have no issue, but yes maybe less performance.
>>
>> Thanks,
>> Shanliang
>>>
>>> Cheers,
>>>
>>> -JB-
>>>
>>>>
>>>> Thanks,
>>>> Shanliang
>>>>> One problem I do see with the test is that it does not wait for a
>>>>> VMStartEvent before setting up requests. I’m not sure if that could
>>>>> cause the failure in the bug report, though.
>>>>>
>>>>> /Staffan
>>>>>
>>>>> On 11 feb 2014, at 15:13, shanliang <shanliang.jiang at oracle.com>
>>>>> wrote:
>>>>>
>>>>>> Hi ,
>>>>>>
>>>>>> The problem could be that FieldMonitor did not have enough time to
>>>>>> "addFieldWatch" but the vm to monitor (TestPostFieldModification)
>>>>>> was
>>>>>> already ended.
>>>>>>
>>>>>> So we should make sure that TestPostFieldModification exits after
>>>>>> FieldMonitor has done necessary. The solution proposed here is that
>>>>>> FieldMonitor creates a file after adding field watching, and
>>>>>> TestPostFieldModification quits only after finding the file.
>>>>>>
>>>>>> web:
>>>>>> http://icncweb.fr.oracle.com/~shjiang/webrev/8007710/00/
>>>>>>
>>>>>> bug:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8007710
>>>>>>
>>>>>> Thanks,
>>>>>> Shanliang
>>>>>
>>>>
>>>>
>>>
>>
>
More information about the serviceability-dev
mailing list