JDK-8176828: jtools do not list VM process launched with the debugger option suspend=y
gary.adams at oracle.com
gary.adams at oracle.com
Fri Nov 30 10:03:48 UTC 2018
It turns out that almost all the diagnostic commands provide
meaningful output even though the vm thread is not totally
initialized.
We could declare the perfmemory initialized a little earlier ...
diff --git a/src/hotspot/share/runtime/thread.cpp
b/src/hotspot/share/runtime/thread.cpp
--- a/src/hotspot/share/runtime/thread.cpp
+++ b/src/hotspot/share/runtime/thread.cpp
@@ -3902,6 +3902,9 @@
// may be attached late and JVMTI must track phases of VM execution
JvmtiExport::enter_live_phase();
+ // Make perfmemory accessible
+ create_vm_timer.end();
+
// Notify JVMTI agents that VM initialization is complete - nop if
no agents.
JvmtiExport::post_vm_initialized();
@@ -3951,7 +3954,6 @@
}
}
- create_vm_timer.end();
#ifdef ASSERT
_vm_complete = true;
#endif
This would be the "jcmd -l" output when the post_vm_initialized()
would block on the "suspend=y" processing
23732 jdk.jcmd/sun.tools.jcmd.JCmd -l
22526 Unknown
... when the debugger attaches "jdb -attach 5900"
23771 jdk.jdi/com.sun.tools.example.debug.tty.TTY -attach 5900
23884 jdk.jcmd/sun.tools.jcmd.JCmd -l
22526 Unknown
... when the debugger starts with the "run" command
23922 jdk.jcmd/sun.tools.jcmd.JCmd -l
23771 jdk.jdi/com.sun.tools.example.debug.tty.TTY -attach 5900
22526 my
We could also pull out the perfmemory set accessible step
and set it explicitly.
...
On 11/28/18 11:10 PM, David Holmes wrote:
> I've been lurking on this ...
>
> On 29/11/2018 9:41 am, gary.adams at oracle.com wrote:
>> On 11/28/18 4:12 PM, Chris Plummer wrote:
>>> On 11/28/18 11:52 AM, Gary Adams wrote:
>>>> https://bugs.openjdk.java.net/browse/JDK-8156537
>>>> - Added a fix for module naming
>>>>
>>>> https://bugs.openjdk.java.net/browse/JDK-8176533
>>>> - Fixed a regression from JDK-816537 that prevented "jcmd <pid>
>>>> <cmd>"
>>>> from sending <cmd> to <pid>
>>>>
>>>> https://bugs.openjdk.java.net/browse/JDK-8176828
>>>> - Requests that "jcmd -l" should list the <pid>
>>>> for the VM that has not completed initialization.
>>>> This is not a regression, because jdk8 jcmd did
>>>> not display the uninitialized VM either.
>>>>
>>>> It appears you can send "jcmd <pid> <cmd>" to
>>>> the process that has not completed vm initialization.
>>> So what happens when you do this?
>> The commands work, albeit the vm thread is blocked waiting for the
>> debugger connection.
>
> Define "work". If the VM is partially initialized there is very little
> that can be examined. If the VMThread is blocked on the debugger
> connection then you can't do anything that requires a VM operation
> (which includes safepoints - though at this stage if there are no
> JavaThreads we're safe anyway).
>
> Thanks,
> David
>
>>>
>>> Chris
>>>>
>>>> On 11/28/18, 2:29 PM, Chris Plummer wrote:
>>>>> Sorry, meant to say "before JDK-8176533".
>>>>>
>>>>> Chris
>>>>>
>>>>> On 11/28/18 10:11 AM, Chris Plummer wrote:
>>>>>> Hi Gary,
>>>>>>
>>>>>> This seems reasonable. I just want clarification on one thing
>>>>>> first. Before JDK-8176828, it listed the suspend=y process, but
>>>>>> could you do anything with it? I'm assuming no, and therefore it
>>>>>> makes sense not to list it at all.
>>>>>>
>>>>>> thanks,
>>>>>>
>>>>>> Chris
>>>>>>
>>>>>> On 11/28/18 8:33 AM, Gary Adams wrote:
>>>>>>> I'd like to close JDK-8176828 as will not fix.
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8176828
>>>>>>>
>>>>>>> This bug was originally thought to be associated with
>>>>>>> a regression fix in JDK-8176533, but I believe there
>>>>>>> is simply a misunderstanding of how the "suspend=y"
>>>>>>> behavior is supported for the jdwp agent library.
>>>>>>>
>>>>>>> The "suspend=y" setting is designed to maximize the number
>>>>>>> of events that can been seen by an attaching debugger.
>>>>>>> This calls for the process to be waiting for the debugger
>>>>>>> connection
>>>>>>> before the VM has been completely initialized.
>>>>>>>
>>>>>>> In particular, the thread.cpp create_vm() function causes the
>>>>>>> debugInit.c initialize() function to start the transport connection
>>>>>>> and wait for an external debugger to attach. Once the dt_socket
>>>>>>> connection
>>>>>>> is established the create_vm() function will complete. It is the
>>>>>>> processing of the create_vm_timer.end() that results in the
>>>>>>> management.cpp record_vm_startup_time() and the
>>>>>>> PerfMemory::set_accessible(true) to be set.
>>>>>>>
>>>>>>> Without the accessible field being set an external program can
>>>>>>> not use
>>>>>>> the PerfMemory. That is why "jcmd -l" passes over processes which
>>>>>>> do not have an initialized VM running.
>>>>>>>
>>>>>>> =====
>>>>>>> src/hotspot/share/runtime/:
>>>>>>> src/jdk.jdwp.agent/share/native/libjdwp/:
>>>>>>>
>>>>>>> thread.cpp:3587:jint Threads::create_vm(JavaVMInitArgs* args,
>>>>>>> bool* canTryAgain) {
>>>>>>> ...
>>>>>>> thread.cpp:3610: create_vm_timer.start();
>>>>>>> ...
>>>>>>> thread.cpp:3907: JvmtiExport::post_vm_initialized();
>>>>>>> ...
>>>>>>> debugInit.c:432:cbEarlyVMInit(jvmtiEnv *jvmti_env, JNIEnv
>>>>>>> *env, jthread thread)
>>>>>>> ...
>>>>>>> debugInit.c:103:static void initialize(JNIEnv *env, jthread
>>>>>>> thread, EventIndex triggering_ei);
>>>>>>> ...
>>>>>>> debugInit.c:732: (void)bagEnumerateOver(transports,
>>>>>>> startTransport, &arg);
>>>>>>> ...
>>>>>>> debugInit.c:751: transport_waitForConnection();
>>>>>>> ...
>>>>>>> thread.cpp:3955: create_vm_timer.end();
>>>>>>>
>>>>>>> ====
>>>>>>> src/hotspot/share/services/management.cpp:
>>>>>>>
>>>>>>> 203 void Management::record_vm_startup_time(jlong begin,
>>>>>>> jlong duration) {
>>>>>>> 204 // if the performance counter is not initialized,
>>>>>>> 205 // then vm initialization failed; simply return.
>>>>>>> 206 if (_begin_vm_creation_time == NULL) return;
>>>>>>> 207
>>>>>>> 208 _begin_vm_creation_time->set_value(begin);
>>>>>>> 209 _end_vm_creation_time->set_value(begin + duration);
>>>>>>> 210 PerfMemory::set_accessible(true);
>>>>>>> 211 }
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>
More information about the serviceability-dev
mailing list