RFR: 8296324: JVMTI GetStackTrace truncates vthread stack trace for agents loaded into running VM [v2]
Chris Plummer
cjplummer at openjdk.org
Fri Nov 18 03:47:03 UTC 2022
On Fri, 18 Nov 2022 02:11:39 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:
>> src/hotspot/share/prims/jvmtiExport.cpp line 390:
>>
>>> 388: ThreadInVMfromNative tiv(JavaThread::current());
>>> 389: java_lang_VirtualThread::init_static_notify_jvmti_events();
>>> 390: }
>>
>> Doesn't this logic mean that if the first pass through this code is made with an unattached thread, then that will prevent subsequent passes from calling `init_static_notify_jvmti_events`, even if the thread is attached. The reason is because `java_lang_VirtualThread::set_notify_jvmti_events(true);` will already have been done, so you won't pass the `if (!java_lang_VirtualThread ::notify_jvmti_events())` check.
>
> Enabling the `notify_jvmti_events` is an optimization to avoid having this notification overhead with JVMTI virtual thread mount state transitions when it is not needed.
> We need to enable it only once and never disable it if enabled.
> The first attempt to enable it is at startup if there was any agent loaded with command line options.
> In such a case, the get_jvmti_interface() is called in a context of `AgentOnLoad()` in unattached thread.
> It only sets the `java_lang_VirtualThread::set_notify_jvmti_events(true)` The `init_static_notify_jvmti_events()` is called from the `javaClasses_init()`.
> The agents that are loaded into running VM are initialized with the `AgentOnAttach()`.
> In this case, we can't rely on the `javaClasses_init()` and so, have to explicitly call the `init_static_notify_jvmti_events()`.
> I feels like this can be simplified. I keep thinking about the best way to do it.
> Probably, the pair <set_notify_jvmti_events, init_static_notify_jvmti_events> can be replaced with just function. The problem is that we can't use the `ThreadInVMfromNative` helper for unattached thread.
If `notify_jvmti_events()` is false, then you call `set_notify_jvmti_events(true)`, which means you will never enter the `if` block again. However, if the thread is not attached, you do not call `init_static_notify_jvmti_events()`. What happens if later there is an attached thread that triggers this code? Is seem when that happens you should call `init_static_notify_jvmti_events()`, but won't because `notify_jvmti_events()` is true.
-------------
PR: https://git.openjdk.org/jdk/pull/11204
More information about the hotspot-dev
mailing list