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:04 UTC 2022
On Fri, 18 Nov 2022 03:42:39 GMT, Chris Plummer <cjplummer at openjdk.org> wrote:
>> 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.
I think you need a flag that tells you if `init_static_notify_jvmti_events()` has been called.
-------------
PR: https://git.openjdk.org/jdk/pull/11204
More information about the serviceability-dev
mailing list